RegEnumVal - Bug oder Programmierfehler

  • Hallo,

    folgendes Problem:

    Ich lese in einem Script per RegEnumVal alle Wertenamen eines Schlüssels aus, vergleiche diese Werte dann auf bestimmte Vorkommen und
    lösche dann diejenigen die diese Bedingung nicht erfüllen. Hier der Quelltext ....

    Spoiler anzeigen


    $sRegKey = "HKEY_LOCAL_MACHINE\Testkey\"

    ;*** Dieses Script benötigt volle Admin-Rechte ***
    #RequireAdmin
    ;*************************************************

    _SyncReg ()

    Func _SyncReg ()
    Local $j, $k, $sSyncFound, $nRetRegSync
    For $j = 1 to 30
    $sSyncFound = 0
    $nRetRegSync = RegEnumVal($sRegKey, $j)
    If @error <> 0 Then ExitLoop
    If StringInStr($nRetRegSync,"TestName") Then $sSyncFound = 1
    If $sSyncFound = 0 Then
    _DelReg ($nRetRegSync)
    EndIf
    Next
    EndFunc ;==> _SyncReg

    Func _DelReg ($sTempName)
    Local $nRegDelKey
    $nRegDelKey = RegDelete ($sRegKey, $sTempName)
    EndFunc ;==> _DelReg

    Das Problem ist nun daß nicht alle Schlüssel gelöscht werden die $sSyncFound = 0 sind. Die For-Schleife zur Ermittlung der Wertenamen durchläuft dann komischerweise nicht alle Instanzen sobal ein Schlüssel gelöscht wurde. Hat jemand ne Idee ?

    Gruß

    Markus

    Einmal editiert, zuletzt von bordermax (2. Februar 2013 um 15:26)

  • Funktioniert das?

    Spoiler anzeigen
    [autoit]


    $sRegKey = "HKEY_LOCAL_MACHINE\Testkey\"

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

    ;*** Dieses Script benötigt volle Admin-Rechte ***
    #RequireAdmin
    ;*************************************************

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

    _SyncReg ()

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

    Func _SyncReg ()
    Local $j, $k, $sSyncFound, $nRetRegSync
    For $j = 1 to 30
    $sSyncFound = 0
    $nRetRegSync = RegEnumVal($sRegKey, $j)
    If @error <> 0 Then ExitLoop
    If StringInStr($nRetRegSync,"TestName") Then $sSyncFound = 1
    If $sSyncFound = 0 Then
    $j -=1
    _DelReg ($nRetRegSync)
    EndIf
    Next
    EndFunc ;==> _SyncReg

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

    Func _DelReg ($sTempName)
    Local $nRegDelKey
    $nRegDelKey = RegDelete ($sRegKey, $sTempName)
    EndFunc ;==> _DelReg

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Ich habe mir das so gedacht:

    Stell dir mal vor du hast vier Werte in der Registry

    1 = Wert 1
    2 = Wert 2
    3 = Wert 3
    4 = Wert 4

    Nun löscht du z.B. Wert 2, dann rutscht Wert 3 an die stelle von Wert 2 und Wert 4 an die stelle von Wert 3.

    1 = Wert 1
    2 = Wert 3
    3 = Wert 4

    Die For Schleife hat geht nun einfach weiter zu Wert 4. und Wert 3 wurde nicht geprüft, er bleibt übrig.
    Deshalb dachte ich, dass nach dem Löschen eines Wertes die selbe Stelle nochmal überprüft werden sollte. Wenn ich nun also $j immer um eins verringere, wenn ein Wert gelöscht wird müsste es gehen.