Loop Reg

Ruft die Inhalte eines bestimmten Registry-Unterschlüssels nacheinander ab.

Loop Reg SchlüsselName , Modus

Parameter

SchlüsselName

Typ: Zeichenkette

Der vollständige Name des Registry-Schlüssels, z.B. "HKLM\Software\BeliebigeApp".

Der Name muss entweder mit HKEY_LOCAL_MACHINE (oder HKLM), HKEY_USERS (oder HKU), HKEY_CURRENT_USER (oder HKCU), HKEY_CLASSES_ROOT (oder HKCR) oder HKEY_CURRENT_CONFIG (oder HKCC) beginnen.

Um auf eine Remote-Registry zuzugreifen, stellen Sie den Computernamen und einen umgekehrten Schrägstrich voran, z.B. "\\workstation01\HKLM".

Modus

Typ: Zeichenkette

Wenn leer oder weggelassen, werden nur Werte einbezogen und Unterschlüssel nicht rekursiv durchwandert. Andernfalls geben Sie einen oder mehrere der folgenden Buchstaben an:

Bemerkungen

Eine Registry-Schleife ist nützlich, wenn mehrere Werte oder Unterschlüssel in der Registry nacheinander abgearbeitet werden sollen. Die Werte und Unterschlüssel werden in umgekehrter Reihenfolge (von unten nach oben) abgerufen, so dass RegDelete und RegDeleteKey innerhalb der Schleife verwendet werden können, ohne die Schleife zu unterbrechen.

Die folgenden Variablen sind nur in einer Registry-Schleife von Bedeutung. Wenn eine innere Registry-Schleife von einer äußeren Registry-Schleife umschlossen ist, hat das Element der innersten Schleife Vorrang:

Variable Beschreibung
A_LoopRegName Name des aktuell abgerufenen Elements, was entweder der Name eines Wertes oder der Name eines Unterschlüssels sein kann. Wertenamen, die im Registry-Editor als "(Standard)" dargestellt werden, werden abgerufen, wenn ihnen ein Wert zugewiesen wurde - A_LoopRegName selbst wird aber leer sein.
A_LoopRegType Typ des aktuell abgerufenen Elements, was eines der folgenden Wörter sein kann: KEY (d.h. das aktuell abgerufene Element ist ein Unterschlüssel, kein Wert), 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 (kommt eher selten vor). Diese Variable ist leer, wenn das aktuell abgerufene Element von unbekanntem Typ ist.
A_LoopRegKey Der vollständige Name des Schlüssels, der das aktuelle Schleifenelement enthält. Bei einem Remote-Registry-Zugriff wird dieser Wert nicht den Computernamen enthalten.
A_LoopRegTimeModified Der Zeitpunkt, wann der aktuelle Unterschlüssel oder einer seiner Werte zuletzt geändert wurde. YYYYMMDDHH24MISS-Format. Diese Variable ist leer, wenn das aktuell abgerufene Element kein Unterschlüssel ist (also wenn A_LoopRegType nicht das Wort KEY ist).

Innerhalb einer Registry-Schleife können die folgenden Funktionen in vereinfachter Form verwendet werden, um anzugeben, dass sie mit dem aktuell abgerufenen Element arbeiten sollen:

Syntax Beschreibung
Wert := RegRead() Liest das aktuelle Element. Wenn das aktuelle Element ein Schlüssel ist, wird eine Ausnahme ausgelöst.
RegWrite Wert
RegWrite
Schreibt in das aktuelle Element. Wenn Wert weggelassen wird, wird das Element je nach Typ auf 0 gesetzt oder leer gemacht. Wenn das aktuelle Element ein Schlüssel ist, wird eine Ausnahme ausgelöst und die Registry nicht verändert.
RegDelete Löscht das aktuelle Element, wenn es ein Wert ist. Wenn das aktuelle Element ein Schlüssel ist, wird stattdessen sein Standardwert gelöscht.
RegDeleteKey Löscht das aktuelle Element, wenn es ein Schlüssel ist. Wenn das aktuelle Element ein Wert ist, löscht der Schlüssel, der diesen Wert enthält, inklusive aller Unterschlüssel und Werte.
RegCreateKey Arbeitet mit einem Schlüssel wie oben bei RegDeleteKey beschrieben. Wenn der Schlüssel während der Schleife gelöscht wird, kann er mit RegCreateKey neu erstellt werden. Andernfalls prüft RegCreateKey lediglich, ob das Skript Schreibzugriff auf den Schlüssel hat.

Beim Zugriff auf eine Remote-Registry (über den SchlüsselName-Parameter, wie oben beschrieben) müssen Sie Folgendes beachten:

Der One True Brace (OTB) Style wird unterstützt, d.h. Sie können je nach Bedarf die geschweifte Startklammer am Zeilenende positionieren. Zum Beispiel: Loop Reg "HKLM\Software\AutoHotkey", "V" {.

Auf der Loop-Seite finden Sie Informationen zu Blöcken, Break, Continue und A_Index (die in jeder Schleifenvariante verwendet werden kann).

Nach der Schleife kann optional eine Else-Anweisung angegeben werden, die ausgeführt wird, wenn keine Registry-Elemente des angegebenen Typs gefunden wurden (d.h. wenn die Schleife null Wiederholungen hatte).

Loop, Break, Continue, Blöcke, RegRead, RegWrite, RegDelete, RegDeleteKey, SetRegView

Beispiele

Ruft die Inhalte eines bestimmten Registry-Unterschlüssels nacheinander ab.

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

Löscht den Link-Verlauf des Internet Explorers.

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

Ein funktionierendes Testskript.

Loop Reg, "HKCU\Software\Microsoft\Windows", "R KV"  ; Schlüssel und Werte rekursiv abrufen.
{
    if A_LoopRegType = "key"
        Wert := ""
    else
    {
        try
            Wert := RegRead()
        catch
            Wert := "*error*"
    }
    Ergebnis := MsgBox(A_LoopRegName " = " Wert " (" A_LoopRegType ")`n`nWeiter?",, "y/n")
}
Until Ergebnis = "No"

Sucht rekursiv in der gesamten Registry nach bestimmten Werten.

RegSuche("Notepad")

RegSuche(Ziel)
{
    Loop Reg, "HKEY_LOCAL_MACHINE", "KVR"
    {
        if !RegElementPrüfen()  ; Suche stoppen.
            return
    }
    Loop Reg, "HKEY_USERS", "KVR"
    {
        if !RegElementPrüfen()  ; Suche stoppen.
            return
    }
    Loop Reg, "HKEY_CURRENT_CONFIG", "KVR"
    {
        if !RegElementPrüfen()  ; Suche stoppen.
            return
    }
    ; Hinweis: Ich glaube nicht, dass HKEY_CURRENT_USER durchsucht werden muss,
    ; wenn HKEY_USERS durchsucht wird. Ebenso bietet HKEY_CLASSES_ROOT eine
    ; kombinierte Ansicht der Schlüssel von HKEY_LOCAL_MACHINE und
    ; HKEY_CURRENT_USER, so dass eine Suche in allen dreien unnötig ist.

    RegElementPrüfen()
    {
        if A_LoopRegType = "KEY"  ; Dies entfernen, um auch Schlüsselnamen zu prüfen.
            return true
        try
            RegWert := RegRead()
        catch
            return true
        if InStr(RegWert, Ziel)
        {
            Ergebnis := MsgBox(
            (
            "Die folgende Übereinstimmung wurde gefunden:
            " A_LoopRegKey "\" A_LoopRegName "
            Wert = " RegWert "
            
            Weiter?"
            ),, "y/n")
            if Ergebnis = "No"
                return false  ; Aufrufer mitteilen, die Suche zu stoppen.
        }
        return true
    }
}