获取指定的注册表子键的内容, 每次一个项目.
Loop, RootKey [, Key, IncludeSubkeys?, Recurse?]
RootKey | 必须是 HKEY_LOCAL_MACHINE (或 HKLM), HKEY_USERS (或 HKU), HKEY_CURRENT_USER (或 HKCU), HKEY_CLASSES_ROOT (或 HKCR), 或 HKEY_CURRENT_CONFIG (或 HKCC) 的其中一个. 要访问远程注册表, 在前面加上计算机名称和一个冒号, 例如这个例子: \\workstation01:HKEY_LOCAL_MACHINE |
Key | 键名 (例如 Software\SomeApplication). 如果为空或省略, 将获取 根键 的内容. |
IncludeSubkeys? | 0 (默认值) 不获取 Key 包含的子键 (仅获取值). |
Recurse? | 0 (默认值) 不递归子键. 1 对子键进行递归, 以便获取包含在其中的所有值和子键. |
当你想对收集的注册表值或子键每次一个进行操作时, 注册表循环是有用的. 获取值和子键使用逆序 (从底到顶) 以便在循环内使用 RegDelete 命令时不会使循环混乱.
下面的变量存在于任何的注册表循环中. 如果内层的注册表循环封装在外层的注册表循环中, 最内层循环的注册表项目将拥有优先权:
A_LoopRegName | 当前获取的项的名称, 可以是一个值名或子键名. 在 Windows RegEdit 值名显示为 "(Default)" 的项如果被分配了值, 则它将被获取, 不过此时 A_LoopRegName 将是空的. |
A_LoopRegType | 当前获取项目的类型, 可以是下列单词的其中一个: KEY (例如当前获取的项目是子键而不是值), REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ, REG_DWORD, REG_QWORD, REG_BINARY, REG_LINK, REG_RESOURCE_LIST, REG_FULL_RESOURCE_DESCRIPTOR, REG_RESOURCE_REQUIREMENTS_LIST, REG_DWORD_BIG_ENDIAN (在大多数 Windows 硬件上是很罕见的). 如果当前获取的项目是一个未知的类型, 此变量将为空. |
A_LoopRegKey | 被访问的根键名 (HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_USER, HKEY_CLASSES_ROOT, 或 HKEY_CURRENT_CONFIG). 对于远程注册表访问,此值将不包括计算机的名称。 |
A_LoopRegSubKey | 当前子键的名称. 此变量将和 Key 参数相同除非使用了 Recurse 参数来递归浏览其他的子键. 在这种情况下, 此变量将是当前获取项目的完整路径, 不包含根键. 例如: Software\SomeApplication\My SubKey |
A_LoopRegTimeModified | 当前子键或它的任一值最后被修改的时间. 格式为 YYYYMMDDHH24MISS. 如果当前获取的项不是一个子键 (例如 A_LoopRegType 不是单词 KEY) 或者操作系统是 Win9x (因为 Win9x 系统不记录这个信息)时, 此变量将是空的. |
在注册表循环中使用下列命令时, 可以使用一种简化的方式来操作当前获取的项目:
RegRead, OutputVar | 读取当前项目. 如果当前项目是一个键, ErrorLevel 将被设置为 1 同时 OutputVar 被置空. |
RegWrite [, Value] | 写入到当前项目. 如果省略了 Value, 项目根据其类型被置为 0 或空. 如果当前项目是一个键, ErrorLevel 将被设置为 1, 不会产生其他的效果. |
RegDelete | 删除当前项目. 如果当前项目是一个键, 它以及它包含的所有子键和值都将被删除. |
要访问远程注册表时 (通过上面描述的 RootKey 参数), 请遵循下列说明:
请参看 Loop 获取关于 Blocks, Break, Continue, 和 A_Index 变量 (其存在于每种类型的循环中) 的信息.
Loop, Break, Continue, Blocks, RegRead, RegWrite, RegDelete
; Example: Delete Internet Explorer's history of URLs typed by the user:
Loop, HKEY_CURRENT_USER, Software\Microsoft\Internet Explorer\TypedURLs
RegDelete
?
; Example: A working test script:
Loop, HKEY_CURRENT_USER, Software\Microsoft\Windows, 1, 1
{
if a_LoopRegType = key
value =
else {
RegRead, value
if ErrorLevel
value = *error*
}
MsgBox, 4, , %a_LoopRegName% = %value% (%a_LoopRegType%)`n`nContinue?
IfMsgBox, NO, break
}
?
; Example: A working example to recursively search the entire ; registry for particular value(s). SetBatchLines -1 ; Makes searching occur at maximum speed. RegSearchTarget = Notepad ; Tell the subroutine what to search for. Gosub, RegSearch return RegSearch: ContinueRegSearch = y Loop, HKEY_LOCAL_MACHINE, , 1, 1 { Gosub, CheckThisRegItem if ContinueRegSearch = n ; It told us to stop. return } Loop, HKEY_USERS, , 1, 1 { Gosub, CheckThisRegItem if ContinueRegSearch = n ; It told us to stop. return } Loop, HKEY_CURRENT_CONFIG, , 1, 1 { Gosub, CheckThisRegItem if ContinueRegSearch = n ; It told us to stop. return } ; Note: I believe HKEY_CURRENT_USER does not need to be searched if HKEY_USERS ; is being searched. The same might also be true for HKEY_CLASSES_ROOT if ; HKEY_LOCAL_MACHINE is being searched. return CheckThisRegItem: if A_LoopRegType = KEY ; Remove these two lines if you want to check key names too. return RegRead, RegValue if ErrorLevel return IfInString, RegValue, %RegSearchTarget% { MsgBox, 4, , The following match was found:`n%A_LoopRegKey%\%A_LoopRegSubKey%\%A_LoopRegName%`nValue = %RegValue%`n`nContinue? IfMsgBox, No ContinueRegSearch = n ; Tell our caller to stop searching. } return