Loop (注册表)


获取指定的注册表子键的内容, 每次一个项目.

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 包含的子键 (仅获取值).
1 获取所有的值和子键.
2 仅获取子键 (不获取值).

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