Ältere Ordner löschen

  • Hallo zusammen,

    über die Forensuche bin ich auf die Funktion von Oscar und Micha_he gestoßen. Dateien nach einer bestimmten Anzahl an Tagen löschen (Funktion)

    Leider funktioniert das bei mir nicht wie gewünscht. Ich möchte das auf der Festplatte C:\ im Ordner Backup alle BackupOrdner gelöscht werden die älter als 5 Tage sind. Ein Scipt erstellt jeden abend eine Kopie und legt die in den Ordner wie folgt ab.

    Backup_19.02.15
    Backup_20.02.15
    Backup_21.02.15
    usw..

    Jetzt soll heute der Gesamte Ordner vom 19.02 gelöscht werden alle anderen sollen unberührt bleiben. Was mach ich falsch oder ist diese Funktion nicht geeigenet dafür?

    Spoiler anzeigen
    [autoit]


    #include <Date.au3>
    #include <File.au3>
    #include <Array.au3>

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

    $Server=("C:\Temp\Backup\")
    $Tage=5

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

    _FileDeleteAfterXDays($Server, $Tage, True)
    ;===============================================================================
    ; Function Name: _FileDeleteAfterXDays($sPath, $iDays[, $bForceDel][, $bRek][, $bDirDel][, $bLog])
    ; Description:: löscht Dateien in einem ausgewähltem Verzeichnis (rekursiv)
    ; nach einer angegebenen Anzahl von Tagen
    ; Parameter(s): $sPath = Verzeichnis, aus dem die Dateien gelöscht werden sollen.
    ; $iDays = Dateien, die älter als $iDays (in Tagen) sind, löschen.
    ; $bForceDel = wenn "True" werden auch Dateien/Verzeichnisse gelöscht,
    ; die gegen löschen geschützt sind ("R"-Attribut)
    ; $bRek = wenn "True" wird das Verzeichnis rekursiv (inkl. Unter-
    ; verzeichnisse) durchsucht.
    ; $bDirDel = wenn "True" wird das Unterverzeichnis gelöscht, wenn
    ; es (aufgrund der Löschaktion) leer ist.
    ; $bLog = wenn "True" wird das Ergebnis der Löschaktion in die
    ; Console geschrieben.
    ; Requirement(s): AutoIt-Version min. v3.3.2.0
    ; #include <Date.au3>
    ; Return Value(s): bei Erfolg Rückgabe = 1
    ; bei Fehler Rückgabe = 0
    ; und @error:
    ; 1 = $iDays ist keine oder eine negative Zahl
    ; 2 = Das übergebene Verzeichnis existiert nicht oder ist leer.
    ; Author(s): Oscar (http://www.autoit.de)
    ; Micha_he (http://www.autoit.de)
    ;===============================================================================
    Func _FileDeleteAfterXDays($sPath, $iDays, $bForceDel = True, $bRek = False, $bDirDel = True, $bLog = False)

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

    Local $hSearchm, $hEmpty, $sFile, $sDate, $iRet
    If (Not IsNumber($iDays)) Or ($iDays < 0) Then Return SetError(1, 0, 0)
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $hSearch = FileFindFirstFile($sPath & '*.*')
    If @error Then Return SetError(2, 0, 0)
    While 1
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If @extended Then
    If $bRek Then
    _FileDeleteAfterXDays($sPath & $sFile, $iDays, $bForceDel, $bRek, $bDirDel, $bLog)
    If $bDirDel Then
    $hEmpty = FileFindFirstFile($sPath & $sFile & '\*.*')
    If @error Then
    If $bForceDel Then FileSetAttrib($sPath & $sFile, '-R')
    $iRet = DirRemove($sPath & $sFile)
    If
    $bLog Then ConsoleWrite('Delete Folder "' & $sPath & $sFile
    & '" = ' & StringMid('No Yes', $iRet * 3 + 1, 3) & @CR)
    EndIf
    FileClose($hEmpty)
    EndIf
    EndIf
    Else
    $sDate = StringRegExpReplace(FileGetTime($sPath & $sFile, 0, 1), '(\d{4})(\d{2})(\d{2})(.*)', '$1/$2/$3')
    If _DateDiff('D', $sDate, _NowCalc()) > $iDays Then
    If $bForceDel Then FileSetAttrib($sPath & $sFile, '-R')
    $iRet = FileDelete($sPath & $sFile)
    If
    $bLog Then ConsoleWrite('Delete File "' & $sPath & $sFile &
    '" = ' & StringMid('No Yes', $iRet * 3 + 1, 3) & @CR)
    EndIf
    EndIf
    WEnd
    FileClose($hSearch)
    Return 1
    EndFunc

    [/autoit]

    Besten Dank und Grüße

  • Du schreibst ja nicht, was passiert (oder nicht passiert). Also kann ich nur raten:

    Die Funktion löscht nach dem Alter der Dateien in den Verzeichnissen, nicht nach irgendwelchen Bezeichnungen. Zum Test muss du also das Änderungsdatum der Datei passend setzen (falls Du die Struktur z.B. heute erzeugst).

    Habe die Funktion gerade nochmal geprüft. Tut es noch.
    Beim Einfügen Deines Beispiels, sind aber einige (lange) Zeilen (51, 63) getrennt worden. Achte in Deinem Original darauf.

    Außerdem muss Du die Funktion mit '_FileDeleteAfterXDays($Server, $Tage, True, True)' aufrufen, da sie sonst nur im übergebenen Ordner arbeiten und nicht in den Unterordnern !

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    Einmal editiert, zuletzt von Micha_he (25. Februar 2015 um 11:44)

  • Hallo Micha_he,

    vielen Dank für Deine Antwort.

    Die Ordner haben das entsprechende Änderungsdatum zB der Ordner Backup_19.02.15 hat das Änderungsdatum "19.02.15 23:30" das sollte kein Problem sein.

    Ich möchte das der gesamte Ordner ohne Beachtung der Unterordner gelöscht wird.

    Die Funktion löscht nur wenn ich sie auf Unterordner prüfen lasse - was ich ja nicht möchte. Entweder soll der gesamte Ordner gelöscht werden oder eben nicht.

    Ungefähr verständlich was mein Problem gerade ist? :D

    Besten Dank

  • Welcher 'gesamte Ordner' ? 'C:\Temp\Backup' oder '..\Backup_xx.xx.xx' ?

    Du startes Dein Script wie du es oben geschrieben hast auf den Ordner 'C:\Temp\Backup'.
    Das Script sollte nun alle Dateien 'rekursiv' löschen, die älter wie 5 Tage sind. Und sind anschließend die Ordner leer, werden auch die Ordner entfernt, da $bDirDel standardmäßig auf TRUE steht.

    Wenn Du den 2. Parameter weg lässt (oder auf False setzt) werden nur Dateien im angegebenen Verzeichnis beachtet und ggf. gelöscht und da liegt ja in Deiner Struktur keine 'Datei' ! Der im 1. Parameter angegebene Ordner bleibt immer bestehen !

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Die einzelnen Ordner Backup_xx.xx.xx

    Problem bei dem rekrusiven ablauf und der leer Prüfung das er mir in den Backups Ordner (Unterordner) löscht die leer sind und zB vom Backup_24.02.15 sind.

    Vllt. versteh ich auch was falsch oder das Script kann ich nicht verwenden. Alle Ordner die älter als 5 Tage sind sollen komplett gelöscht werden - ohne Beachtung auf unterordner. Geht sowas?

    Danke.

  • Versuch mal diese Funktion. Änderung: Leere Ordner werden nur gelöscht, wenn auch deren Alter älter wie die angegebene Anzahl Tage ist.

    Spoiler anzeigen
    [autoit]

    Func _FileDeleteAfterXDays($sPath, $iDays, $bForceDel = False, $bRek = True, $bDirDel = True, $bLog = True)
    Local $hSearchm, $hEmpty, $sFile, $sDate, $iRet
    If (Not IsNumber($iDays)) Or ($iDays < 0) Then Return SetError(1, 0, 0)
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $hSearch = FileFindFirstFile($sPath & '*.*')
    If @error Then Return SetError(2, 0, 0)
    While 1
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If @extended Then
    If $bRek Then
    _FileDeleteAfterXDays($sPath & $sFile, $iDays, $bForceDel, $bRek, $bDirDel, $bLog)
    If $bDirDel Then
    $hEmpty = FileFindFirstFile($sPath & $sFile & '\*.*')
    If @error Then
    $sDate = StringRegExpReplace(FileGetTime($sPath & $sFile, 0, 1), '(\d{4})(\d{2})(\d{2})(.*)', '$1/$2/$3')
    If _DateDiff('D', $sDate, _NowCalc()) > $iDays Then
    If $bForceDel Then FileSetAttrib($sPath & $sFile, '-R')
    $iRet = DirRemove($sPath & $sFile)
    If $bLog Then ConsoleWrite('Delete Folder "' & $sPath & $sFile & '" = ' & StringMid('No Yes', $iRet * 3 + 1, 3) & @CR)
    EndIf
    EndIf
    FileClose($hEmpty)
    EndIf
    EndIf
    Else
    $sDate = StringRegExpReplace(FileGetTime($sPath & $sFile, 0, 1), '(\d{4})(\d{2})(\d{2})(.*)', '$1/$2/$3')
    If _DateDiff('D', $sDate, _NowCalc()) > $iDays Then
    If $bForceDel Then FileSetAttrib($sPath & $sFile, '-R')
    $iRet = FileDelete($sPath & $sFile)
    If $bLog Then ConsoleWrite('Delete File "' & $sPath & $sFile & '" = ' & StringMid('No Yes', $iRet * 3 + 1, 3) & @CR)
    EndIf
    EndIf
    WEnd
    FileClose($hSearch)
    Return 1
    EndFunc

    [/autoit]

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • @Kanashius: Danke für die Info. Dann brauch ich danach nicht mehr suchen. || Schade würde gerne ohne Beachtung auf Inhalt löschen. :)

    @Micha_he: Alles klar! Sieht gut aus! Nachdem ich durch die testerei die meisten Backups schon gelöscht habe muss ich das in ein paar Tagen erneut Probieren - mit dem aktuellen Test sah das aber gut aus.

    Besten Dank

  • Zitat von Kanashius

    Die müssen nämlich gelöscht werden, bevor der Ordner gelöscht werden kann. Es können keine Ordner mit Inhalt gelöscht werden.

    Wozu hat dann der Befehl DirRemove() einen zweiten Parameter (den ich ja prinzipbedingt nicht verwenden kann) ?

    Der Hintergrund war einfach der, erst sollten eigenlich nur alte Dateien entfernt werden, dann später auch rekursiv.
    Nun blieben immer die leeren Ordner liegen. In meinem Fall, wusste ich ja im Vorfeld nicht, was die Benutzer in dem Ordner anlegen !
    Also habe ich später eben diese leeren Ordner entfernen lassen. Das einmal jemand Interesse an den 'leeren Ordnern' haben könnte, hatte ich nicht bedacht ;)

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Jetzt verstehe ich, Du meinst den rein technischen Ablauf des Löschvorgangs auf Betriebssystem-Ebene. Da magst Du Recht haben. Nur glaube ich nicht, das PopupBlocker sich darin vertiefen will...

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Hallo zusammen,

    über die Forensuche bin ich auf die Funktion von Oscar und Micha_he gestoßen. Dateien nach einer bestimmten Anzahl an Tagen löschen (Funktion)

    Leider funktioniert das bei mir nicht wie gewünscht. Ich möchte das auf der Festplatte C:\ im Ordner Backup alle BackupOrdner gelöscht werden die älter als 5 Tage sind. Ein Scipt erstellt jeden abend eine Kopie und legt die in den Ordner wie folgt ab.

    Besten Dank und Grüße

    hast du zufällig noch das script dafür ich komme nicht auf den Beitrag von micha

  • Damit solltest Du auf mein damaliges Beispiel kommen: Klick

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"