Problem mit for...next

  • Hallo zusammen,

    ich möchte bestimmte Subkeys in der Registry löschen.
    Mit einer for...next Schleife frage ich zunächst einmal die Enträge ab.
    Ich habe nun 2 Probleme:
    - die Begrenzung auf 30 (ich weiß leider nicht wie ich es variabel gestalten kann
    - Das Anzeigen der Einträge in der MsGBox funktioniert - wenn ich per RegDelete löschen will,
    so löscht er nur ein paar anstatt alle.
    Habt Ihr eine Idee?

    Spoiler anzeigen
    [autoit]

    for $i = 1 to 30
    $var = RegEnumKey("HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Mountpoints2", $i)
    If @error <> 0 then ExitLoop
    If StringLeft ($var,2) = "##" Then
    MsgBox(4096, "SubKey" & $i & " under ", $var)
    ;RegDelete ("HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Mountpoints2\"&$var)
    EndIf
    Next

    [/autoit]

    Vielen Dank & viele Grüße
    Jörg

    2 Mal editiert, zuletzt von Baruse (14. März 2012 um 13:06)

    • Offizieller Beitrag

    - die Begrenzung auf 30 (ich weiß leider nicht wie ich es variabel gestalten kann

    Schreib doch einfach 1.000 oder 10.000 hin. Wenn nichts mehr gefunden wird, wird ja auch die Schleife verlassen.

    so löscht er nur ein paar anstatt alle.

    Lass dir doch der @error-Wert ausgeben vom Löschvorgang. Evtl. besteht keine Zugriffsberechtigung (bzw. nur Lesen) auf diesen Schlüssel.

  • Zitat von »Baruse«



    - die Begrenzung auf 30 (ich weiß leider nicht wie ich es variabel gestalten kann
    Schreib doch einfach 1.000 oder 10.000 hin. Wenn nichts mehr gefunden wird, wird ja auch die Schleife verlassen.

    stimmt schon - ich finde nur daß es "unsauber" aussieht

    Zitat von »Baruse«



    so löscht er nur ein paar anstatt alle.
    Lass dir doch der @error-Wert ausgeben vom Löschvorgang. Evtl. besteht keine Zugriffsberechtigung (bzw. nur Lesen) auf diesen Schlüssel.

    das komische ist: wenn ich das nun 3x laufen lasse, so löscht er mir jedesmal ein paar

    Schreib doch einfach 1.000 oder 10.000 hin. Wenn nichts mehr gefunden wird, wird ja auch die Schleife verlassen.

    Lass dir doch der @error-Wert ausgeben vom Löschvorgang. Evtl. besteht keine Zugriffsberechtigung (bzw. nur Lesen) auf diesen Schlüssel.

    Ich habe jetzt mal folgendes eingefügt:

    Spoiler anzeigen
    [autoit]

    If @error <> 0 then MsgBox (64, "Fehler", @error)

    [/autoit]


    da kommt dann 7x ein Fenster mit dem Wert "-1" und danach ist Schluß

    Einmal editiert, zuletzt von Baruse (14. März 2012 um 13:07)

    • Offizieller Beitrag

    da kommt dann 7x ein Fenster mit dem Wert "-1" und danach ist Schluß


    Und was sagt dazu die Hilfe?

    Zitat

    -1 if unable to delete requested value

    Wie ich vermutet habe, du wirst keine Berechtigung haben den Schlüssel zu löschen, vielleicht noch in Nutzung oder generell schreibgeschützt.

  • Zitat

    -1 wenn der gewünschte Wert nicht gelöscht werden konnte

    Wenn dir das mit der FOR Schleife nich gefällt, kannst du's ja auch in eine DO-UNTIL verpflanzen:

    [autoit]

    Do
    $var = RegEnumKey("HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Mountpoints2", $i)
    If StringLeft($var, 2) = "##" Then
    $iDel = RegDelete("HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Mountpoints2\" & $var)
    EndIf
    Until $iDel = 0

    [/autoit]
  • i2c: ich bekomme leider den Fehler "Variable used without being declared."
    BugFix : OK - vielen Dank; was aber komisch ist, denn wenn ich den String "zu Fuß" lösche, dann klappt es problemlos;
    sprich wenn ich nun 10 zu löschende Einträge habe und 10 Zeilen beginnend mit "RegDelete....." eintrage, so löscht er
    alle Einträge zuverlässig;
    mache ich das mit dieser for...next Abfrage, so löscht er ein paar und der Rest bleibt stehen; starte ich das Script erneut, so werden wieder ein paar gelöscht
    Komisch...

  • Der Zähler fehlte ...

    [autoit]

    $i = 1
    Do
    $var = RegEnumKey("HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Mountpoints2", $i)
    If StringLeft($var, 2) = "##" Then
    $iDel = RegDelete("HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Mountpoints2\" & $var)
    EndIf
    $i += 1
    Until $iDel = 0

    [/autoit]
  • Sorry wenn ich nochmal "nerve", aber ich komme leider noch immer nicht weiter;
    aktuell gibt es noch 2 Probleme.
    bei folgendem Script fehlt noch die Deklaration von $iDel
    mit $iDel = 1
    dann funktioniert es, aber das Script endet nie

    bei $iDel = 0
    passiert gar nix

    Spoiler anzeigen
    [autoit]

    $i = 1
    Do
    $var = RegEnumKey("HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Mountpoints2", $i)
    If StringLeft($var, 2) = "##" Then
    $iDel = RegDelete("HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Mountpoints2\" & $var)
    EndIf
    $i += 1
    Until $iDel = 0

    [/autoit]

    Das zweite Problem:
    Das Script löscht nicht alle Einträge in einem Rutsch.
    Lasse ich es öfters laufen, so wird sauber gelöscht;
    Lösche ich jeden Eintrag aus der Registry mit RegDelete, so funktioniert dies auch ohne Probleme;
    Irgendwas bringt die Schleife zum Exit... :wacko:

    Einmal editiert, zuletzt von Baruse (14. März 2012 um 13:07)

  • Spoiler anzeigen
    [autoit]


    Dim $i = 1, $iDel = 1
    Do
    $var = RegEnumKey("HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Mountpoints2", $i)
    ;ConsoleWrite("### Key Found : "&$var&@CRLF)
    If StringLeft($var, 2) = "##" Then
    $iDel = RegDelete("HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Mountpoints2\" & $var)
    ;ConsoleWrite("### Key Gelöscht: "&$var&" Rückgabewert : "&$iDel&@CRLF)
    EndIf
    $i += 1
    Until $iDel = 0

    [/autoit]

    weiß nicht so wirklich wo dein Problem liegt.. also bei mir läuft alles..

  • Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    _Delete()

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

    Func _Delete()
    Local $RegRead, $iDel
    Local $i = 1
    While 1
    $RegRead= RegEnumKey("HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Mountpoints2", $i)
    If @error Then ExitLoop ; Schleife verlassen wenn Error gesetzt wurde von RegEmunKey also zb wen kein Eintrag gefunden wurde
    $i = $i + 1
    ;ConsoleWrite("### Key Found : "&$RegRead&@CRLF)
    If StringLeft($RegRead, 2) = "##" Then
    $iDel = RegDelete("HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Mountpoints2\" & $RegRead)
    ;ConsoleWrite("### Key Gelöscht: "&$RegRead&" Rückgabewert : "&$iDel&@CRLF)
    EndIf
    WEnd
    EndFunc

    [/autoit]

    also ich habe das Script nun mal etwas umgebaut aber naja es macht das gleiche, ich weiß echt nicht wo dein Problem Liegt

    Gruß Marvin

  • Hallo Marvin,

    vielen Dank für Deine Unterstützung!
    Das Script wird jetzt sauber beendet, sprich das Problem mit der Endlosschleife ist behoben.

    Jedoch wird noch immer nicht alles gelöscht

    Ausgangssituation: 6 Einträge in der Registry
    Script läuft das 1. Mal --> löscht 3 Einträge
    Script läuft das 2. Mal --> löscht 2 Einträge
    Script läuft das 3. Mal --> löscht 1 Eintrag

    Und das noachvollziehbar jedes Mal :(

    Viele Grüße
    Jörg

  • So habe das Script nochmal umgebaut, wenn es diesmal nun wieder nicht läuft liegt das Problem definitiv nicht am Script

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

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

    _Delete()
    Func _Delete()
    Local $aArray[1],$RegRead, $i = 0, $z
    Local $sRegPath = "HKCU\Software\Microsoft\Windows\Currentversion\Explorer\Mountpoints2"
    While 1
    $i = $i + 1
    $RegRead = RegEnumKey($sRegPath,$i)
    If @error Then ExitLoop
    If StringLeft($RegRead,2) = '##' Then _ArrayAdd($aArray,$RegRead)
    WEnd
    _ArrayDisplay($aArray)
    For $z = 1 To UBound($aArray)-1
    ; RegDelete($sRegPath&'\'&$aArray[$z])
    Next
    EndFunc

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