Loop Reg

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

Loop Reg KeyName , Mode

参数

KeyName

类型: 字符串

注册表键的全名, 例如 "HKLM\Software\SomeApplication".

必须以 HKEY_LOCAL_MACHINE(或 HKLM), HKEY_USERS(或 HKLM), HKEY_CURRENT_USER(或 HKLM), HKEY_CLASSES_ROOT(或 HKLM) 或 HKEY_CURRENT_CONFIG(或 HKLM) 开始.

要访问远程注册表, 请在前面加上计算机名和反斜杠, 例如 "\\workstation01\HKLM".

Mode

类型: 字符串

如果为空或省略, 则只包含值且不递归子键. 否则, 指定一个或多个下列字母:

备注

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

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

变量 描述
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 包含当前循环项目的键的全名. 对于远程注册表访问, 该值 包括计算机名称.
A_LoopRegTimeModified 当前子键或其任何值最后被修改的时间. 格式为 YYYYMMDDHH24MISS. 如果当前检索到的项目不是子键(即 A_LoopRegType 不是单词 KEY), 则该变量为空.

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

语法 描述
Value := RegRead() 读取当前项. 如果当前项为键, 则抛出异常.
RegWrite Value
RegWrite
写入到当前项. 如果省略 Value, 根据不同的类型当前项可能被置为 0 或空. 如果当前项为键, 则抛出异常, 并且注册表不会被修改.
RegDelete 如果当前项目是值, 则删除当前项目. 如果当前项目是键, 则会删除其默认值.
RegDeleteKey 如果当前项目是键, 则删除当前项目. 如果当前项目是一个值, 则 包含 该值的键将被删除, 包括所有子键和值.
RegCreateKey 如上面 RegDeleteKey 所示的目标键. 如果该键在循环中被删除, 则可以使用 RegCreateKey 重新创建该键. 否则, 仅仅验证脚本是否具有对键的写访问权.

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

可以选择使用 One True Brace(OTB) 样式, 它允许左大括号出现在同一行而不是下面. 例如: Loop Reg "HKLM\Software\AutoHotkey", "V" {.

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

循环后面可以有一个可选的 Else 语句, 如果没有找到指定类型的注册表项(即循环的迭代次数为零), 则执行 Else 语句.

Loop, Break, Continue, 区块, RegRead, RegWrite, RegDelete, RegDeleteKey, SetRegView

示例

检索指定注册表子键的内容, 每次检索一项.

Loop Reg, "HKEY_LOCAL_MACHINE\Software\SomeApplication"
    MsgBox A_LoopRegName

删除用户输入的 Internet Explorer 的 URL 历史.

Loop Reg, "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\TypedURLs"
    RegDelete

有效的测试脚本.

Loop Reg, "HKCU\Software\Microsoft\Windows", "R KV"  ; 递归检索键和值.
{
    if A_LoopRegType = "key"
        value := ""
    else
    {
        try
            value := RegRead()
        catch
            value := "*error*"
    }
    Result := MsgBox(A_LoopRegName " = " value " (" A_LoopRegType ")`n`nContinue?",, "y/n")
}
Until Result = "No"

用于在整个注册表中递归搜索特定值.

RegSearch("Notepad")

RegSearch(Target)
{
    Loop Reg, "HKEY_LOCAL_MACHINE", "KVR"
    {
        if !CheckThisRegItem()  ; 这里告知我们要停止搜索.
            return
    }
    Loop Reg, "HKEY_USERS", "KVR"
    {
        if !CheckThisRegItem()  ; 这里告知我们要停止搜索.
            return
    }
    Loop Reg, "HKEY_CURRENT_CONFIG", "KVR"
    {
        if !CheckThisRegItem()  ; 这里告知我们要停止搜索.
            return
    }
    ; 请注意: 我认为如果已经搜索了 HKEY_USERS, 那么可以不必搜索 HKEY_CURRENT_USER.
    ; 同样地, HKEY_CLASSES_ROOT  提供了
    ; HKEY_LOCAL_MACHINE 和 HKEY_CURRENT_USER 键的集合视图, 所以完全搜索这三个键是没有必要的.

    CheckThisRegItem()
    {
        if A_LoopRegType = "KEY"  ; 如果您也想检查键名, 那么移除这两行.
            return true
        try
            RegValue := RegRead()
        catch
            return true
        if InStr(RegValue, Target)
        {
            Result := MsgBox(
            (
            "The following match was found:
            " A_LoopRegKey "\" A_LoopRegName "
            Value = " RegValue "
            
            Continue?"
            ),, "y/n")
            if Result = "No"
                return false  ; 告知我们的调用者停止搜索.
        }
        return true
    }
}
unixetc