Such- und Löschfunktion

  • Hallo zusammen,

    ich benötige ein Script bzw. eine Funktion die mir folgendes ermöglicht.

    Suche unter C:\Dokumente und Einstellungen nach den Ordner XYZ und zwar in allen Ordner die unter C:\Dokumente und Einstellungen vorhanden sind, lösche alle Ordner XYZ.


    LG

    Schnuecks

  • Ich hoffe das ist so wie du dir das vorstellst!!

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

    $Folder = InputBox( "Ordner löschen" , "Gib den Namen des Ordners ein, der gelöscht werden soll!" )
    If $Folder = "" Then Exit

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

    $result = DirRemove("C:\Dokumente und Einstellungen\" & $Folder , 1)
    If $result = 1 Then
    MsgBox( 0 , "Erfolg" , "Der Ordner wurde erfolgreich gelöscht!" )
    Else
    MsgBox( 0 , "Fehler" , "Der Ordner konnte nicht gelöscht werden," & @CRLF & "vielleicht is er nicht vorhanden!" )
    EndIf

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


    mfg | -mr. sex pistols

    • Offizieller Beitrag

    Schau mal hier: http://autoit.aufwaerts.de/thread.php?threadid=1249&hilight=rekursiv
    Mit der Funktion von Jos:

    [autoit]

    $Daten = _GetFileList($Pfad,$Extension,1) ; alle Ordner

    [/autoit]

    werden ab "$Pfad" alle Unterordner rekursiv ausgelesen. Da du nur die Ordner ausliest, übergibst du für "$Extension" einen nicht existierenden Wert (z.B. "n").
    Im Array "$Daten" findest du dann alle Unterordner .
    Jetzt kannst du das Array nach deinem gesuchten Ordner durchforsten und -falls vorhanden - löschen.
    Mit der Lösung von mR. sEx p!sT0Ls kannst du nur den angegebenen Pfad durchsuchen - also nicht rekursiv.

  • Kann mir das jemand von Euch so bauen das ich die rekursive Suche verwenden kann. bin noch ziemlich neu und kenne mich noch nicht so sehr aus.

    ist alles noch neuland für mich.

    trotzdem schonmal vielen dank für die antworten.

    • Offizieller Beitrag

    Jaja -so ein Schlingel ;)
    Aber wir wollen mal nicht so sein. Ich hab dir noch eine Logdatei hinzugefügt, damit du auch siehst, was passiert ist.

    Spoiler anzeigen
    [autoit]

    $StartPfad = "C:\Dokumente und Einstellungen"
    $SuchOrdner = "XYZ"
    $Daten = _GetFileList($StartPfad, "n",1)
    $file = FileOpen(@MyDocumentsDir & "\Remove.log", 1) ; Logfile mit Eintrag der gelöschten Ordner
    FileWriteLine($file, "Start: [" & @YEAR & "-" & @MON & "-" & @MDAY & " / " & @HOUR & ":" & @MIN & ":" & @SEC & "]" & @CRLF & "gelöscht wurden:")
    For $i = 1 To $Daten[0]
    If StringRight($Daten[$i], StringLen($Daten[$i]-StringInStr($Daten[$i], "\", Default, -1))) = $SuchOrdner Then
    DirRemove($Daten[$i])
    FileWriteLine($file, $Daten[$i])
    EndIf
    Next
    FileWriteLine($file, "Ende: [" & @YEAR & "-" & @MON & "-" & @MDAY & " / " & @HOUR & ":" & @MIN & ":" & @SEC & "]")
    FileClose($file)
    MsgBox(0, '', "Ich haben fertig...")

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

    ; Function: _GetFileList($T_DIR,$T_MASK[,$DIR_ONLY=0])
    ; AutoIt Version: 3.0
    ; Language: English
    ; Platform: Win9x/NT/XP
    ; Author: jos van der Zande
    ;
    ; Find files in directory and subdirectories and return it in an Array, all coded in Autoit3
    ;
    ;********************************************************************************
    ;Recursive search for filemask
    ;********************************************************************************

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

    Func _GetFileList($T_DIR,$T_MASK,$DIR_ONLY=0)
    Dim $N_DIRNAMES[200000] ; max number of directories that can be scanned
    Local $N_DIRCOUNT = 0
    Local $N_FILE
    Local $N_SEARCH
    Local $N_TFILE
    Local $N_OFILE
    Local $T_FILENAMES
    Local $T_FILECOUNT
    Local $T_DIRCOUNT = 1
    Local $FILEMASK
    ; check Filemask \ for empty File-Array by GetDirOnly
    If $FILEMASK = "n" Then $FILEMASK = "*.no"
    ; remove the end \ If specified
    If StringRight($T_DIR,1) = "\" Then $T_DIR = StringTrimRight($T_DIR,1)
    $N_DIRNAMES[$T_DIRCOUNT] = $T_DIR
    ; Exit if base dir doesn't exists
    If Not FileExists($T_DIR) Then Return 0
    ; keep on looping until all directories are scanned
    While $T_DIRCOUNT > $N_DIRCOUNT
    $N_DIRCOUNT = $N_DIRCOUNT + 1
    ; find all subdirs in this directory and save them in a array
    $N_SEARCH = FileFindFirstFile($N_DIRNAMES[$N_DIRCOUNT] & "\*.*")
    While 1
    $N_FILE = FileFindNextFile($N_SEARCH)
    If @error Then ExitLoop
    ; skip these references
    If $N_FILE = "." Or $N_FILE = ".." Then ContinueLoop
    $N_TFILE = $N_DIRNAMES[$N_DIRCOUNT] & "\" & $N_FILE
    ; if Directory than add to the list of directories to be processed
    If StringInStr(FileGetAttrib( $N_TFILE ),"D") > 0 Then
    $T_DIRCOUNT = $T_DIRCOUNT + 1
    $N_DIRNAMES[$T_DIRCOUNT] = $N_TFILE
    EndIf
    Wend
    FileClose($N_SEARCH) ; find all Files that mtach the MASK
    $N_SEARCH = FileFindFirstFile($N_DIRNAMES[$N_DIRCOUNT] & "\" & $T_MASK )
    If $N_SEARCH = -1 Then ContinueLoop
    While 1
    $N_FILE = FileFindNextFile($N_SEARCH)
    If @error Then ExitLoop
    ; skip these references
    If $N_FILE = "." Or $N_FILE = ".." Then ContinueLoop
    $N_TFILE = $N_DIRNAMES[$N_DIRCOUNT] & "\" & $N_FILE
    ; if Directory than add to the list of directories to be processed
    If StringInStr(FileGetAttrib( $N_TFILE ),"D") = 0 Then
    $T_FILENAMES = $T_FILENAMES & $N_TFILE & @CR
    $T_FILECOUNT = $T_FILECOUNT + 1
    ;MsgBox(0,'filecount ' & $T_FILECOUNT ,$N_TFILE)
    EndIf
    Wend
    FileClose($N_SEARCH)
    Wend
    If $DIR_ONLY = 0 Then
    $T_FILENAMES = StringTrimRight($T_FILENAMES,1)
    $N_OFILE = StringSplit($T_FILENAMES,@CR)
    Return( $N_OFILE )
    Else
    ReDim $N_DIRNAMES[$N_DIRCOUNT+1]
    $N_DIRNAMES[0] = $N_DIRCOUNT
    Return $N_DIRNAMES
    EndIf
    EndFunc ;==>_GetFileList

    [/autoit]

    EDIT:

    Falls du nicht ganz durchsiehst, was in der Schleife in der IF-Abfrage passiert (ist am Anfang nicht so einfach, bei den String-Funktionen durchzusehen ;) ) - ich habs nochmal auseinander gepflückt.

    Spoiler anzeigen
    [autoit]

    For $i = 1 To $Daten[0]
    $Position = StringInStr($Daten[$i], "\", Default, -1) ; ermittelt Position des ersten Backslash von rechts
    $Anzahl = StringLen($Daten[$i]) - $Position ; ermittelt die Zeichenzahl des Ordnernamens
    $VergleichOrdner = StringRight($Daten[$i], $Anzahl) ; Ordnername wird abgeschnitten
    If $VergleichOrdner = $SuchOrdner Then
    DirRemove($Daten[$i])
    FileWriteLine($file, $Daten[$i])
    EndIf
    Next

    [/autoit]
    • Offizieller Beitrag

    Du hast recht - er tuts nur mit der Lizenz zum Töten :rofl: (Flag 1, Löschen von Unterverzeichnissen und Files erlaubt)
    Muß dann so aussehen:

    [autoit]

    DirRemove($Daten[$i], 1)

    [/autoit]

    Aber das Log sollte zumindest die gefundenen Ordner schon mal zeigen -auch wenn der Löschvorgang nicht erfolgreich war. Bei mir hat er es getan.

  • Also bei mir siehts so aus

    Start: [2006-11-17 / 11:16:30]
    gelöscht wurden:
    Ende: [2006-11-17 / 11:16:30]
    Start: [2006-11-17 / 11:17:56]
    gelöscht wurden:
    Ende: [2006-11-17 / 11:17:56]


    Die Verzeichnisse gibt es aber nur so zur Info ^^

    LG

    Schnuecks

    Einmal editiert, zuletzt von Schnuecks (17. November 2006 um 11:20)

    • Offizieller Beitrag

    Füge mal hinter dieser Zeile:

    [autoit]

    $Daten = _GetFileList($StartPfad, "n",1)

    [/autoit]


    zur Kontrolle eine MsgBox ein:

    [autoit]

    MsgBox(0,'', "Anzahl Ordner in $Daten : " & $Daten[0])

    [/autoit]


    Dann erfährst du, ob überhaupt Ordner ausgelesen wurden.
    Eigentlich kann nur ein Fehler im Pfad liegen. Check nochmal genau die Schreibweise.
    Bei mir funktioniert es tadellos.

    EDIT:
    Vielleicht ist bei Copy&Paste was schiefgegangen ?
    Ich hänge jetzt mal meine, funktionierende Version an.

  • Kann es sein da ja in diesem Ordner bzw. Unterordnen auch verteckte Ordner sind das er die die ich Suche deshalb nicht findet wil Sie versteckt sind.

    Ich muss da nämlich unter Anwendungsdaten was suchen lassen und der ist ja versteckt

    LG

    Schnuecks

    • Offizieller Beitrag
    Zitat

    das er die die ich Suche deshalb nicht findet wil Sie versteckt sind.


    Da liegt mit Sicherheit der Hund begraben.
    Die Funktion _GetFileList( ) selektiert Ordner mit dem Attribut "D". Ist der Ordner aber versteckt sind die Attribute "D,H,S" oder ähnlich.
    Prüfe also zuerst mit

    [autoit]

    MsgBox(0, '', FileGetAttrib($StartPfad & "\" & $SuchOrdner) )

    [/autoit]


    welche Attribute dein gesuchter Ordner hat. Dann mußt du in der Funktion die beiden IF-Abfragen mit

    [autoit]

    If StringInStr(FileGetAttrib( $N_TFILE ),"D") > 0 ; bzw.
    If StringInStr(FileGetAttrib( $N_TFILE ),"D") = 0

    [/autoit]


    ergänzen mit:

    Code
    ... Or StringInStr(FileGetAttrib( $N_TFILE ),"D,H,S")

    - entsprechend deinen Attributen.

  • Finden tut er ja alle Ordner die Anzahl stimmt zumindest war aber auch vor der Änderung so. Er findet einfach die Ordner nicht die ich such. Es kann ja nicht sein das ich den Ordner genau angeben muss, weil dann kann ich mir das ganze schenken.

    LG

    Schnuecks

    PS: Ich blicks glaub nicht mehr.

    • Offizieller Beitrag

    Es kann natürlich sein, dass der Ordner aufgrund seines Versteckt-Attributes von einigen Funktionen nicht erkannt wird - weiß ich aber nicht.
    Vielleicht hat ja schon jemand mit versteckten Files/Ordnern seine Erfahrungen.
    Gib die Hoffnung nicht auf - aber hier muß ich erstmal passen.

  • Na ich werde auf der Suche bleiben, falls jemand es weiss wie es geht aber trotzdem schreiben. Ich benötige es immer noch dringend. Das ganze brauche ich für eine Installation.

    LG

    Schnuecks

    BugFix bisher vielen vielen dank