# 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 参数), 请遵循下列说明:

- 目标机器必须运行远程注册表服务, 或 (对于 Windows Me/98/95) 必须安装 Microsoft 的远程注册表服务 (这个可以从 Microsoft 获取).
- 访问远程注册表可能失败, 如果目标计算机和您的不在相同的域或者本地或远程的用户名缺少足够的权限 (不过, 可以尝试的可能解决方法见下文).
- 在尝试远程注册表访问之前, 根据您的用户名所在的域, 工作组, 和/或权限, 您可能需要链接到一个共享设备, 如通过映射驱动器.建立这样一个连接 -- 使用拥有访问和编辑远程注册表权限的用户名和密码 -- 作为一个副作用也许可以启用远程注册表访问.
- 如果您已经作为一个不同的用户连接到目标计算机 (例如, 通过 Guest 用户映射的驱动器), 您可能必须终止这个连接以允许远程注册表功能使用您当前登录的用户名重新连接和认证.
- 对于 Windows Server 2003 and Windows XP 专业版, MSDN 中说明: "如果 [registry server] 的计算机加入了工作组并且 强制以本地账户的来宾身份进行网络登录验证 策略被启用, 此功能失败. 请注意, 如果计算机加入了工作组, 这项策略默认是开启的."
- 对于 Windows XP 家庭版, MSDN 中说明 "这项功能总是失败的". 家庭版没有注册表的服务器和客户端, 尽管客户端可以从系统中的 cab 压缩包里提取.

请参看 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