RegEnumKey und mehrer zeichenfolgen abfragen??

  • Hallo,

    ich möchte alle Unterschlüssel auslesen inklusive einiger zeichenfolgen."vendor" "Version" "status" "Installdate" "..."

    Also so in etwa:
    "HKEY_LOCAL_MACHINE\SOFTWARE\MeineSoftware\Produkt1" "vendor" "Version" "status" "Installdate" "..."
    "HKEY_LOCAL_MACHINE\SOFTWARE\MeineSoftware\Produkt2" "vendor" "Version" "status" "Installdate" "..."
    "HKEY_LOCAL_MACHINE\SOFTWARE\MeineSoftware\Produkt3" "vendor" "Version" "status" "Installdate" "..."
    ..
    ..
    ...


    Habe schon erste versuche aber komme nicht weiter eventuell ist auch mein ganzer ansatz falsch??!!

    [autoit]

    #include <array.au3>

    [/autoit][autoit][/autoit][autoit]

    Local $keys [1] [2], $startkey ="HKEY_LOCAL_MACHINE\SOFTWARE\MeineSoftware\", $string = "RC0"

    [/autoit][autoit][/autoit][autoit]

    For $i= 1 to 100
    $var = RegEnumKey($startkey, $i)
    If @error <> 0 then ExitLoop
    $keys [$i - 1] [0] = $var
    ReDim $keys [$i + 1] [2]
    Next

    [/autoit][autoit][/autoit][autoit]

    For $i = 0 To UBound ($keys) - 1
    $regkey = RegRead ($startkey & "\" & $keys [$i] [0], "Status")
    If @error <> 0 then ExitLoop
    If $regkey <> $string Then
    $keys [$i] [1] = $regkey
    EndIf
    Next

    [/autoit][autoit][/autoit][autoit]

    For $i = ubound($keys) - 1 To 0 Step -1
    If $keys[$i][1] = 'RC0' Then _ArrayDelete($keys, $i)
    Next

    [/autoit][autoit][/autoit][autoit]

    _ArrayDisplay ($keys)

    [/autoit]

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

    2 Mal editiert, zuletzt von subzero007 (19. April 2010 um 16:41)

    • Offizieller Beitrag

    So sollte es funktionieren (Du hattest die Schleife verlassen, falls 'Status' nicht gelesen wird, du mußt aber fortsetzen).

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    Local $keys[1][2] = [''], $startkey ="HKEY_LOCAL_MACHINE\SOFTWARE\MeineSoftware\", $string = "RC0"

    [/autoit] [autoit][/autoit] [autoit]

    For $i= 1 to 100
    $var = RegEnumKey($startkey, $i)
    If @error Then ExitLoop
    If $keys[UBound($keys) -1][0] <> '' Then ReDim $keys[UBound($keys) +1][2]
    $keys[UBound($keys) -1][0] = $var
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($keys) -1
    $regkey = RegRead($startkey & "\" & $keys[$i][0], "Status")
    If @error Then ContinueLoop ; falls für den Schlüssel kein 'Status' vorhanden ==> nächsten Schlüssel lesen
    If $regkey <> $string Then
    $keys[$i][1] = $regkey
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; ==> Das folgende ist unnütz, da du nur dann Werte einträgst, wenn der Wert <> 'RC0' ist
    ;~ For $i = Ubound($keys) -1 To 0 Step -1
    ;~ If $keys[$i][1] = 'RC0' Then _ArrayDelete($keys, $i)
    ;~ Next

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay ($keys)

    [/autoit]


    Im Moment liest du aber nur 'Status' aus - ist das gewollt?

  • Danke ;)
    Ja status ist gewollt..
    wie kann ich den die anderen zeichenfolgen mit abfragen?

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

    • Offizieller Beitrag

    Einfach in einem Array hinterlegen und durchlaufen:

    Spoiler anzeigen
    [autoit]

    Local $keys[1][4] ; <== zweite Dimension nach Anzahl der zu lesenden Schlüssel
    ;...
    ;...

    [/autoit] [autoit][/autoit] [autoit]

    Local $aReadKey[4] = ["vendor","Version","status","Installdate"]
    ; Du kannst auch $aReadKey als 2D verwenden und nicht gewollte Werte zu den Schlüsseln schreiben (also: ['status','RC0'])
    For $i = 0 To UBound($keys) -1
    For $j = 0 To UBound($aReadKey) -1
    $regkey = RegRead($startkey & "\" & $keys[$i][0], $aReadKey[$j]) ; od. $aReadKey[$j][0]
    If @error Then ContinueLoop
    ;~ If $regkey <> $aReadKey[$j][1] Then
    $keys[$i][$j] = $regkey
    ;~ EndIf
    Next
    Next

    [/autoit]
  • Ich weiss nicht ob ich das richtig verstanden habe??

    aber kriege diesen fehler?
    07.au3(2,24) : ERROR: wrong nesting in initializer
    Local $keys[1][2] = ['']


    [autoit]

    #include <array.au3>
    Local $keys[1][2] = [''], $startkey ="HKEY_LOCAL_MACHINE\SOFTWARE\MeineSoftware\", $string = "RC0"

    [/autoit][autoit][/autoit][autoit]

    For $i= 1 to 100
    $var = RegEnumKey($startkey, $i)
    If @error Then ExitLoop
    If $keys[UBound($keys) -1][0] <> '' Then ReDim $keys[UBound($keys) +1][2]
    $keys[UBound($keys) -1][0] = $var
    Next

    [/autoit][autoit][/autoit][autoit]

    For $i = 0 To UBound($keys) -1
    $regkey = RegRead($startkey & "\" & $keys[$i][0], "Status")
    If @error Then ContinueLoop ; falls für den Schlüssel kein 'Status' vorhanden ==> nächsten Schlüssel lesen
    If $regkey <> $string Then
    $keys[$i][1] = $regkey
    EndIf
    Local $keys[1][4] ; <== zweite Dimension nach Anzahl der zu lesenden Schlüssel
    ;...
    ;...

    [/autoit][autoit][/autoit][autoit]

    Local $aReadKey[4] = ["vendor","Version","status","Installdate"]
    ; Du kannst auch $aReadKey als 2D verwenden und nicht gewollte Werte zu den Schlüsseln schreiben (also: ['status','RC0'])
    For $i = 0 To UBound($keys) -1
    For $j = 0 To UBound($aReadKey) -1
    $regkey = RegRead($startkey & "\" & $keys[$i][0], $aReadKey[$j]) ; od. $aReadKey[$j][0]
    If @error Then ContinueLoop
    ;~ If $regkey <> $aReadKey[$j][1] Then
    $keys[$i][$j] = $regkey
    ;~ EndIf
    Next
    Next
    Next

    [/autoit][autoit][/autoit][autoit]

    ; ==> Das folgende ist unnütz, da du nur dann Werte einträgst, wenn der Wert <> 'RC0' ist
    ;~ For $i = Ubound($keys) -1 To 0 Step -1
    ;~ If $keys[$i][1] = 'RC0' Then _ArrayDelete($keys, $i)
    ;~ Next

    [/autoit][autoit][/autoit][autoit]

    _ArrayDisplay ($keys)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit]

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

    2 Mal editiert, zuletzt von subzero007 (14. April 2010 um 16:00)

  • Was mache ich falsch?

    07.au3 (12) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    $regkey = RegRead($startkey & "\" & $keys[$i][0], "Status")
    $regkey = RegRead($startkey & "\" & ^ ERROR


    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    Local $keys[1][2] = [['']] , $startkey ="HKEY_LOCAL_MACHINE\SOFTWARE\Meinesoftware\packages\", $string = "RC0"

    [/autoit] [autoit][/autoit] [autoit]

    For $i= 1 to 100
    $var = RegEnumKey($startkey, $i)
    If @error Then ExitLoop
    If $keys[UBound($keys) -1][0] <> '' Then ReDim $keys[UBound($keys) +1][2]
    $keys[UBound($keys) -1][0] = $var
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($keys) -1
    $regkey = RegRead($startkey & "\" & $keys[$i][0], "Status")
    If @error Then ContinueLoop ; falls für den Schlüssel kein 'Status' vorhanden ==> nächsten Schlüssel lesen
    If $regkey <> $string Then
    $keys[$i][1] = $regkey
    EndIf
    Local $keys[1][4] ; <== zweite Dimension nach Anzahl der zu lesenden Schlüssel
    ;...
    ;...

    [/autoit] [autoit][/autoit] [autoit]

    Local $aReadKey[4] = ["vendor","Version","status","Installdate"]
    ; Du kannst auch $aReadKey als 2D verwenden und nicht gewollte Werte zu den Schlüsseln schreiben (also: ['status','RC0'])
    For $i = 0 To UBound($keys) -1
    For $j = 0 To UBound($aReadKey) -1
    $regkey = RegRead($startkey & "\" & $keys[$i][0], $aReadKey[$j]) ; od. $aReadKey[$j][0]
    If @error Then ContinueLoop
    ;~ If $regkey <> $aReadKey[$j][1] Then
    $keys[$i][$j] = $regkey
    ;~ EndIf
    Next
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; ==> Das folgende ist unnütz, da du nur dann Werte einträgst, wenn der Wert <> 'RC0' ist
    ;~ For $i = Ubound($keys) -1 To 0 Step -1
    ;~ If $keys[$i][1] = 'RC0' Then _ArrayDelete($keys, $i)
    ;~ Next

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay ($keys)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

  • Ok??
    und wie mache ich das?

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

    • Offizieller Beitrag

    Bei mir geht es so:

    [autoit]

    #include <array.au3>
    Local $keys[1][2] = [['']], $startkey = "HKEY_LOCAL_MACHINE\SOFTWARE\", $string = "RC0"

    [/autoit][autoit][/autoit][autoit]

    For $i = 1 To 1000
    $var = RegEnumKey($startkey, $i)
    If @error Then ExitLoop
    If $keys[UBound($keys) - 1][0] <> '' Then ReDim $keys[UBound($keys) + 1][2]
    $keys[UBound($keys) - 1][0] = $var
    Next

    [/autoit][autoit][/autoit][autoit]

    _ArrayDisplay($keys)

    [/autoit]
  • das funktioniert auch bei mir jetzt ...
    und wie kann ich noch zusätzliche zeichenfolgen abfragen und deren werte?

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

  • Sorry wegen push..;-(
    komme leider nicht weiter fange immer wieder von vorne an...
    kann mir jemand helfen?

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

  • Unsere Pakete in der Firma hinterlassen einen bestimmten Schlüssel in der registry die ich auswerten will

    die ist wie folgt aufgebaut.

    hklm\software\MeinePakte\%paketname%

    dann jeweils zeichenfolgen zb.

    Zeichenfolge >Wert
    Installdate >Datum
    Hersteller >Hersteller Name
    Returncode >InstallCode
    Version > Versionummer
    etc... > etc..
    etc... > etc..
    etc... > etc..
    etc... > etc..

    Ich will das alles vom rechner abrufen und auswerten.

    kann mir da jemand helfen?

    Danke

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

  • Ungetestet:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $sStartKey = "HKLM64\software\MeinePakte" ;Ich denk mal du meintest "Pakete" - aber vielleicht auch nicht...
    Global $i = 1, $aInfos[1][4]

    [/autoit] [autoit][/autoit] [autoit]

    Do ;Endlosschleife
    ;gehe nacheinander (von $i abhängig) alle Unterschlüssel durch und gib sie zurück:
    $Key = RegEnumKey($sStartKey, $i)
    If @error <> 0 Then ExitLoop ;Beende Schleife falls z.B. keine weiteren Keys mehr existieren
    $aInfos[0][0] += 1 ;Erhöhe Elementzähler des Arrays um 1
    ConsoleWrite($Key & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ReDim $aInfos[$i + 1][4] ; Vergrößere Array um einen neuen Eintrag hinzuzufügen (ReDim sollte man zwar eigentlich vermeiden und auf andere Strukturen ausweichen)
    $aInfos[$i][0] = RegRead($sStartKey & '\' & $Key, "Installdate") ;Lese Wert "InstallDate" des aktuellen Keys und schreibe ihn in das Array.
    $aInfos[$i][1] = RegRead($sStartKey & '\' & $Key, "Hersteller")
    $aInfos[$i][2] = RegRead($sStartKey & '\' & $Key, "Returncode")
    $aInfos[$i][3] = RegRead($sStartKey & '\' & $Key, "Version")

    [/autoit] [autoit][/autoit] [autoit]

    $i += 1 ; Erhöhe Zählvariable der Schleife um 1
    Until 0

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($aInfos)

    [/autoit]
  • Danke es funktioniert habe aber eine letzte frage ?
    hier sind die werte von den zeichenfolgen enthalten:

    [autoit]

    _ArrayDisplay($aInfos)

    [/autoit]


    in $Key sind die schlüssel enthalten wie kann ich das ganze für mein array kombiniren also so in etwa??

    [autoit]

    _ArrayDisplay($Key&$aInfos)

    [/autoit]


    leider klappt es bitte um hilfe...

    Danke
    SubZero

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

    Einmal editiert, zuletzt von subzero007 (18. April 2010 um 20:21)

  • so in etwa wollte ich es haben.

    Produkt|Installdate|Hersteller|Returncode|Version
    schlüssel|wert|wert|wert|wert

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

    • Offizieller Beitrag

    Dann bau dir ein neues Array auf.

    Ungefähr so :

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $sStartKey = "HKLM64\software\" ;Ich denk mal du meintest "Pakete" - aber vielleicht auch nicht...
    Global $i = 1, $aInfos[1][5]

    [/autoit] [autoit][/autoit] [autoit]

    Do ;Endlosschleife
    ;gehe nacheinander (von $i abhängig) alle Unterschlüssel durch und gib sie zurück:
    $Key = RegEnumKey($sStartKey, $i)
    If @error <> 0 Then ExitLoop ;Beende Schleife falls z.B. keine weiteren Keys mehr existieren
    $aInfos[0][0] += 1 ;Erhöhe Elementzähler des Arrays um 1
    ConsoleWrite($Key & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ReDim $aInfos[$i + 1][5] ; Vergrößere Array um einen neuen Eintrag hinzuzufügen (ReDim sollte man zwar eigentlich vermeiden und auf andere Strukturen ausweichen)
    $aInfos[$i][0] = $Key
    $aInfos[$i][1] = RegRead($sStartKey & '\' & $Key, "Installdate") ;Lese Wert "InstallDate" des aktuellen Keys und schreibe ihn in das Array.
    $aInfos[$i][2] = RegRead($sStartKey & '\' & $Key, "Hersteller")
    $aInfos[$i][3] = RegRead($sStartKey & '\' & $Key, "Returncode")
    $aInfos[$i][4] = RegRead($sStartKey & '\' & $Key, "Version")

    [/autoit] [autoit][/autoit] [autoit]

    $i += 1 ; Erhöhe Zählvariable der Schleife um 1
    Until 0

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($aInfos, '', Default, Default, '', '', "Nr|Produkt|Installdate|Hersteller|Returncode|Version")

    [/autoit]