Loop Reg

指定されたレジストリサブキーの内容を一度に1項目ずつ取得します。

Loop Reg KeyName , Mode

パラメータ

KeyName

型:文字列

レジストリキーのフルネームです。例:"HKLM\Software\SomeApplication"

キーは、HKEY_LOCAL_MACHINE(または HKLM)、HKEY_USERS(または HKU)、HKEY_CURRENT_USER(または HKCU)、HKEY_CLASSES_ROOT(または HKCR)、またはHKEY_CURRENT_CONFIG(または HKCC)で始まらなければなりません。

リモートレジストリにアクセスするには、"\\workstation01\HKLM"のようにコンピューター名とバックスラッシュを前に追加してください。

Mode

型:文字列

空白または省略された場合、値のみが含まれ、サブキーは再帰されません。それ以外の場合は、以下の文字を1つ以上指定してください:

備考

レジストリループは、レジストリ値やサブキーのコレクションを一度に1つずつ操作したい場合に便利です。値とサブキーは逆順(下から上)に取得されるため、ループを中断させることなく、RegDeleteRegDeleteKeyをループ内で使用することができます。

どのレジストリ-ループ内にも、以下の変数が存在します。内側のレジストリループが外側のレジストリループで囲まれている場合、最も内側のループのレジストリ項目が優先されます:

変数 説明
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 現在のループ項目が含まれるキーのフルネーム。リモートレジストリアクセスの場合、この値にはコンピュータ名は含まれません
A_LoopRegTimeModified 現在のサブキーまたはその値のいずれかが最後に変更された時刻。Format YYYYMMDDHH24MISS. 現在検索されている項目がサブキーでない場合(すなわちA_LoopRegTypeがKEYという単語でない場合)、この変数は空となります。

レジストリループ内で使用する場合、以下の関数を簡略化して使用することで、現在検索されている項目が操作されるべきことを示すことができます:

構文 説明
Value := RegRead() 現在の項目を読み取ります。現在の項目がキーである場合、例外が発生します。
RegWrite Value
RegWrite
現在のアイテムに書き込みます。Valueが省略された場合、項目の種類に応じて 0 または空白とします。現在の項目がキーの場合、例外が発生し、レジストリは変更されません。
RegDelete 現在の項目が値である場合、それを削除します。現在の項目がキーの場合、そのデフォルト値が代わりに削除されます。
RegDeleteKey 現在のアイテムがキーの場合、削除します。現在の項目が値の場合、その値を含むキーは、すべてのサブキーと値を含めて削除されます。
RegCreateKey 上記の RegDeleteKey と同様にキーを対象とします。ループ中にキーが削除された場合、RegCreateKeyを使用して再作成することができます。そうでない場合は、RegCreateKeyは、スクリプトがキーへの書き込みアクセス権を持っているかどうかを確認するだけです。

リモートレジストリにアクセスする場合(前述のKeyNameパラメータを使用する場合)、以下の注意事項があります:

オプションで、オープンブレースを下ではなく同じラインに表示させるOTB(One True Brace)スタイルを採用することも可能です。事例:Loop Reg "HKLM\Software\AutoHotkey", "V" {

ブロックBreakContinue、A_Index変数(どのタイプのループにも存在する)については、「Loop」をご覧ください。

このループには、オプションでElse文が続くことがあり、指定されたタイプのレジストリ項目が見つからなかった場合(つまり、ループがゼロ回繰り返された場合)に実行されます。

LoopBreakContinueブロックRegReadRegWriteRegDeleteRegDeleteKeySetRegView

指定されたレジストリサブキーの内容を一度に1項目ずつ取得します。

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, "HKCUSoftware", "Microsoft", "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
    }
    ; Note: I believe HKEY_CURRENT_USER does not need to be searched if
    ; HKEY_USERS is being searched. Similarly, HKEY_CLASSES_ROOT provides a
    ; combined view of keys from HKEY_LOCAL_MACHINE and HKEY_CURRENT_USER, so
    ; searching all three isn't necessary.

    CheckThisRegItem()
    {
        if A_LoopRegType = "KEY"  ; 鍵の名前もチェックしたい場合は、この2行を削除してください。
            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
    }
}