ältere Dateien löschen

  • Hey,
    ich bräuchte mal wieder eure Hilfe [Blockierte Grafik: http://www.autoit.de/file:///C:/Users/jbusjan/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif]

    ich versuche ein über AutoIt alte Backup Dateien zu löschen.
    bisher mache ich das mit

    [autoit]

    _FileDeleteAfterXDays("D:\Backups\", 2,True)

    [/autoit]

    dieser Befehl hat die Schwachstelle das alle Dateien gelöscht werden die älter als 2 Tage sind und das auch wenn das Backup aus irgendwelchen Gründen nicht mehr läuft.

    Ich suche jetzt nach einer Möglichkeit alle Dateien im Ordner bis auf die zwei neusten zu löschen,
    In der Hilfe habe ich dazu nichts gefunden [Blockierte Grafik: http://www.autoit.de/file:///C:/Users/jbusjan/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png]

    Habt Ihr einen Tipp für mich?

    Gruß
    Priest

    Einmal editiert, zuletzt von GorEPriest (19. September 2011 um 14:17)

    • Offizieller Beitrag

    Hier mal das Skript, welches ich für meinen Bedarf nutze. Löschen der Backups > 10 Tage.
    Kannst es ja dann nach deinem Geschmack anpassen.

    Spoiler anzeigen
    [autoit]

    Local $aSavePath[2] = ["\\Dlink-a8098e\Volume_1\GDI_Sicherung\","\\Dlink-a8098e\Volume_1\GDI_Sicherung\Auto\"]
    Local $aFilename

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

    For $i = 0 To 1
    $aFilename = _FileListToArray_RegExFilter($aSavePath[$i], "BLARCHIV\.\d+")
    If @error Then ContinueLoop
    If UBound($aFilename) < 12 Then ContinueLoop
    For $j = 1 To $aFilename[0]
    $time = StringRegExpReplace(FileGetTime($aSavePath[$i] & $aFilename[$j], 1, 1), '(\d{4})(\d{2})(\d{2})(\d{6})', '$1/$2/$3')
    ;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $time = ' & $time & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    If _DateDiff('D', $time, _NowCalcDate()) > 10 Then
    ;~ ConsoleWrite('Löschen: ' & $aSavePath[$i] & $aFilename[$j] & @LF)
    FileDelete($aSavePath[$i] & $aFilename[$j])
    EndIf
    Next
    Next

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

    Func _FileListToArray_RegExFilter($sPath, $sPattern)
    Local $aAllFiles, $sMatches = ''
    $sPath = StringRegExpReplace($sPath, "[\\/]+\z", "") & "\"
    If Not FileExists($sPath) Then Return SetError(1, 1, "")
    $aAllFiles = _FileListToArray($sPath, '*', 1)
    For $i = 1 To $aAllFiles[0]
    If StringRegExp($aAllFiles[$i], $sPattern) Then $sMatches &= $aAllFiles[$i] & '|'
    Next
    If Not StringLen($sMatches) Then Return SetError(1,0,'')
    Return StringSplit(StringTrimRight($sMatches, 1), '|')
    EndFunc

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

    #cs
    Löschen: \\Dlink-a8098e\Volume_1\GDI_Sicherung\BLARCHIV.235
    Löschen: \\Dlink-a8098e\Volume_1\GDI_Sicherung\Auto\BLARCHIV.017
    Löschen: \\Dlink-a8098e\Volume_1\GDI_Sicherung\Auto\BLARCHIV.018
    Löschen: \\Dlink-a8098e\Volume_1\GDI_Sicherung\Auto\BLARCHIV.019
    Löschen: \\Dlink-a8098e\Volume_1\GDI_Sicherung\Auto\BLARCHIV.020
    Löschen: \\Dlink-a8098e\Volume_1\GDI_Sicherung\Auto\BLARCHIV.021
    Löschen: \\Dlink-a8098e\Volume_1\GDI_Sicherung\Auto\BLARCHIV.022
    Löschen: \\Dlink-a8098e\Volume_1\GDI_Sicherung\Auto\BLARCHIV.023
    Löschen: \\Dlink-a8098e\Volume_1\GDI_Sicherung\Auto\BLARCHIV.024
    #ce

    [/autoit]
  • Hey!
    Danke für die schnelle Antwort [Blockierte Grafik: http://www.autoit.de/file:///C:/Users/jbusjan/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif]
    ich überblicke das Script mit meinem beschränkten AutoIt Kenntnissen allerdings noch nicht ganz.
    Prüft das Script irgendwo das ob nach dem löschen noch Dateien überbleiben?

    Bsp.:
    ich stelle das Script so ein das alle Backups > 3 Tage gelöscht werden.
    Das Backup an sich läuft aber aus einem unbestimmten Grund seit 3 oder 4 Tagen nicht mehr.
    erkennt das Script das nur Backups > 3 Tage im Ordner liegen und löscht diese dann nicht?

  • Hi Du, ich löse solche Dinge mit Delage32, kannste in eine CMD-Datei packen oder auch mit Autoit nutzen, wie Du magst...

    Url: http://www.horstmuc.de/wbat32d.htm

    Bsp.: Löscht Backupdateien die aelter sind als 30 Tage.
    delage32 "\\storage\Backups\*.TIB" 30 /modified

    Grüße

    Mike

    • Offizieller Beitrag

    Prüft das Script irgendwo das ob nach dem löschen noch Dateien überbleiben?


    Mein Skript überprüft:
    Wenn: Heute - Erstelldatum > Zeitraum
    Dann: Lösche

    [autoit]

    If _DateDiff('D', $time, _NowCalcDate()) > 10 Then

    [/autoit]

    Hier (Codezeile 11) wird auf älter 10 Tage geprüft.

    Da in meinem Ordner auch andere Dateien liegen, verwende ich _FileListToArray mit einem Filter. Wenn bei dir nur Archivdateien sind, kannst du das sparen.

  • Er will nicht Dateien älter als x Tage löschen sondern die beiden jüngsten Dateien erhalten und alle anderen löschen.

    @MIKE
    Prinzipiell: Zu jedem Dateinamen noch das Datum ermitteln und in ein 2D-Array schreiben. Dann dieses Array nach dem Datum absteigend sortieren und die neuesten beiden Dateien stehen ganz oben.
    Den Rest entsprechend löschen.
    Als kleine Vorlage:

    Spoiler anzeigen
    [autoit]

    FileListToArrayWithDate

    [/autoit]
  • Er will nicht Dateien älter als x Tage löschen sondern die beiden jüngsten Dateien erhalten und alle anderen löschen.

    @MIKE
    Prinzipiell: Zu jedem Dateinamen noch das Datum ermitteln und in ein 2D-Array schreiben. Dann dieses Array nach dem Datum absteigend sortieren und die neuesten beiden Dateien stehen ganz oben.
    Den Rest entsprechend löschen.
    Als kleine Vorlage:

    Spoiler anzeigen
    [autoit]

    FileListToArrayWithDate

    [/autoit]

    Die Funktion werde ich mir auch noch mal angucken, Danke!

    Ich habe jetzt erst einmal die Tatsache genutzt das in dem Ordner solange alles läuft 5 Dateien liegen.
    Damit konnte ich das Script dann so umbauen:


    Spoiler anzeigen
    [autoit]

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

    $folder = "H:\Backups\"
    $dir = _FileListToArray($folder, '*.*')

    IF $dir[0] > 4 Then _FileDeleteAfterXDays("H:\Backups\", 2, 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 = 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
    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]

    Sobald das Backup nicht mehr läuft kommen keine neuen Dateien mehr nach und die letzten Backups bleiben erhalten.


    Danke für die Hilfe ;)

  • Da ist was beim übertragen schief gelaufen - so sollte das vollständige Beispiel aussehen:

    Spoiler anzeigen
    [autoit]

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

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

    $FileList = FileListToArrayWithDate(@DesktopDir)
    _ArrayDisplay($FileList)

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

    Func FileListToArrayWithDate($sPath, $sFilter = "*", $iFlag = 0)
    Local $hSearch, $sFile, $sFileList, $sDelim = "|", $a_Time, $a_x
    $sPath = StringRegExpReplace($sPath, "[\\/]+\z", "") & '\' ; ensure single trailing backslash
    If Not FileExists($sPath) Then Return SetError(1, 1, "")
    If StringRegExp($sFilter, "[\\/:><\|]|(?s)\A\s*\z") Then Return SetError(2, 2, "")
    If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 3, "")
    $hSearch = FileFindFirstFile($sPath & $sFilter)
    If @error Then Return SetError(4, 4, "")
    While 1
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If ($iFlag + @extended = 2) Then ContinueLoop
    $a_Time = FileGetTime($sPath & $sFile)
    $sFileList &= $sFile & ";" & _DateToDayValue($a_Time[0], $a_Time[1], $a_Time[2]) & $sDelim
    WEnd
    FileClose($hSearch)
    If Not $sFileList Then Return SetError(4, 4, "")
    Local $a_Temp = StringSplit(StringTrimRight($sFileList, 1), "|")
    Local $a_Ret[UBound($a_Temp)][2] = [[$a_Temp[0]]]
    For $i = 1 To UBound($a_Temp) - 1
    $a_x = StringSplit($a_Temp[$i], ";", 2)
    $a_Ret[$i][0] = $a_x[0]
    $a_Ret[$i][1] = $a_x[1]
    Next
    _ArraySort($a_Ret, 1, 1, UBound($a_Ret) - 1, 1)
    Return $a_Ret
    EndFunc;==>_FileListToArray

    [/autoit]

    Einmal editiert, zuletzt von AspirinJunkie (9. September 2014 um 14:39)

  • Wow cool, nur was hat es mit der Array.au3 und der Date.au3 auf sich ?
    Magst nomma erklären das ich das auch begreife ? :D

    Danke Dir

    Mike

  • was hat es mit der Array.au3 und der Date.au3 auf sich ?

    In der Array.au3-Datei steckt die Funktion _ArrayDisplay() und _ArraySort und in der Date.au3 steckt die Funktion _DateToDayValue(). Die Funktionen sind sogenannte UDFs (User Defined Functions) und sie werden über #include in ein Skript mit eingebunden nutzbar gemacht.
    FileListToArray gibt dir die Dateinamen als 1D-Array zurück. Wenn man nun 1 Spalte hinzufügt (und daraus nun ein 2D-Array macht) wo das Datum eingetragen ist kann man diese Tabelle (das 2D-Array) nach dem Datum sortieren. Da ein Datum wie wir es kennen selbst schlecht sortierbar ist wandel ich das Datum aber vorher noch in eine fortlaufende Zahl (das julianische Datum).
    Was du nun erhälst und angezeigt bekommst ist ein 2D-Array mit den Dateinamen in der 1. Spalte und dem julianischen Datum in der 2. Spalte (brauch dich aber nicht mehr zu interessieren da das ganze schon fertig absteigend sortiert wurde).
    Wenn du nun eine For-Schleife nimmst um damit das Array durchzugehen (und mit dem 3. Element = Index 2) kannst du nun alle Dateien bis auf die beiden neuesten löschen.