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

键名(例如 Software\SomeApplication)。如果为空或省略, 将获取 根键 的内容.

IncludeSubkeys?

0 (默认值) 不获取 Key 中包含的子键 (仅获取值).
1获取所有的值和子键.
2仅获取子键 (不获取值).

递归?
0 (默认值) 不对子键进行递归.
1对子键进行递归, 以便获取包含在其中的所有值和子键.

备注

当您想对注册表值或子键集合中的项逐个进行操作时, 注册表循环很有用. 值和子键以逆序获取 (自下而上), 这样在循环中使用 RegDelete 不会扰乱循环自身.

下列变量存在于任何注册表循环中。如果一个内层注册表循环包含在一个外层注册表循环中,那么最内层循环的注册表项将具有优先权:

A_LoopRegName 当前获取项的名称, 可以是值名或子键名. 在 Windows 注册表编辑器中, 值名为 "(默认)" 的项如果分配了值, 那么也会获取它的值, 不过此时相应的 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 当前子键名. 如果没有使用 Recurse 参数以递归查询其他子键时, 此变量的值与 Key 参数相同. 在递归查询时, 此变量的值将为当前获取项的完整路径, 其中不包含根键. 例如: Software\SomeApplication\My SubKey
A_LoopRegTimeModified 当前子键或其中任何一个值的上次修改时间. 格式为 YYYYMMDDHH24MISS. 当前获取项不是子键(即 A_LoopRegType 不是单词 KEY)时,此变量将为空。

在注册表循环中使用下列命令时, 可以以一种简化的方式来操作当前获取项:

RegRead, OutputVar 读取当前项. 如果当前项为键, ErrorLevel 将被置为 1 且 OutputVar 将被置空.
RegWrite [, Value] 写入到当前项. 如果省略 Value, 根据不同的类型当前项可能被置为 0 或空. 如果当前项为键, ErrorLevel 将被置为 1 且没有其他效果.
RegDelete 删除当前项. 如果当前项为键, 它以及它所包含的所有子键和值都将被删除.

访问远程注册表时 (通过上面描述的 RootKey 参数), 需要注意以下事项:

请参阅 Loop 了解关于区块BreakContinue 和 A_Index 变量(其存在于各种类型的循环中)的相关信息。

相关

LoopBreakContinue区块RegReadRegWriteRegDeleteSetRegView

示例

; 示例: 删除用户输入的 Internet Explorer URL 历史:
Loop, HKEY_CURRENT_USER, Software\Microsoft\Internet Explorer\TypedURLs
    RegDelete

 

; 示例: 有效的测试脚本:
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
}

 

; 示例: 用于在整个注册表中
; 递归搜索特殊值的可运行示例.
SetBatchLines -1  ; 让搜索以最快速度进行.
RegSearchTarget = Notepad  ; 告知子程序搜索的目标.
Gosub, RegSearch
return

RegSearch:
ContinueRegSearch = y
Loop, HKEY_LOCAL_MACHINE, , 1, 1
{
    Gosub, CheckThisRegItem
    if ContinueRegSearch = n ; 这里告知我们要停止搜索.
        return
}
Loop, HKEY_USERS, , 1, 1
{
    Gosub, CheckThisRegItem
    if ContinueRegSearch = n ; 这里告知我们要停止搜索.
        return
}
Loop, HKEY_CURRENT_CONFIG, , 1, 1
{
    Gosub, CheckThisRegItem
    if ContinueRegSearch = n ; 这里告知我们要停止搜索.
        return
}
; 请注意: 我认为如果已经搜索了 HKEY_USERS, 那么可以不必搜索
; HKEY_CURRENT_USER.  同样地, 如果搜索了 HKEY_LOCAL_MACHINE,
; 那么可以不必搜索 HKEY_CLASSES_ROOT.
return

CheckThisRegItem:
if A_LoopRegType = KEY  ; 如果您也想检查键名, 那么移除这两行.
    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  ; 告知我们的调用者停止搜索.
}
return