Dateien löschen die älter als 90 Tage sind

  • Hallo,

    ich würde gerne Dateien in einem bestimmten Verzeichnis löschen (Datensicherungen) die älter als 90 Tage sind.
    Habe hier leider kein Script dazu gefunden. Könnte mir da vielleicht jemand auf die Sprünge helfen?

    Gruß

    tokenizer

  • Hier mal ein Ansatz:

    Spoiler anzeigen

    -Dateien in Array lesen
    -Für jede Datei im Array
    ->Wenn Erstelldatum älter als 90Tage -> Lösche Datei

    Vill. hilft dir das.

    Mfg

    Einmal editiert, zuletzt von kloklo (27. Dezember 2009 um 23:22)

    • Offizieller Beitrag
    Spoiler anzeigen
    [autoit]

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

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

    ;Root folder
    $sourceFolder = @ScriptDir & '\'

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

    ;Gather files into an array
    $fileList = _FileListToArray($sourceFolder, "*", 1)
    Dim $found[1]

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

    ;Loop through array
    For $X = 1 To $fileList[0]
    ;Retrieve creation time of file
    $Date = FileGetTime($sourceFolder & "\" & $fileList[$X], 1, 0)
    ;Format date for use with Date UDF
    $fDate = StringFormat("%s/%s/%s %s:%s:%s", $Date[0], $Date[1], $Date[2], $Date[3], $Date[4], $Date[5])
    ;Calculate age, remove files older than seven days
    If _DateDiff('d', $fDate, _NowCalc()) > 7 Then ; the time
    ;FileDelete($sourceFolder & "\" & $fileList[$X])
    _ArrayAdd($found, $sourceFolder & $fileList[$X])
    ;MsgBox(1, "Files deleted:", $fileList[$X], 1)
    EndIf
    $found[0] = UBound($found)
    Next
    _ArrayDisplay($found)

    [/autoit]
  • @ Xenobiologist

    Um es mal umgangssprachlich zu formulieren: "Bo eh!" :)
    Da lass ich ja gleich die Flügel hängen.

    Vielen Dank für das ausführliche Script.
    Und ich dachte autoit sollte eine Erleichterung darstellen...
    Ich glaube ich versuche es doch erst mal mit einem *einfachen* Batch-Programm.

    Trotzdem vielen Dank für Deine Unterstützung.

    Aller Anfag ist schwer.
    Daher sollte man manchmal garnicht erst anfangen ;)

    Gruß

    token

  • Schade, da war ich wohl zu langsam... hier meine Version:

    Spoiler anzeigen
    [autoit]


    #include <Date.au3>
    _DeleteOld(@DesktopDir,90)

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

    Func _DeleteOld($sPath,$iDays,$iMode=0)
    ;SEuBo
    ;$iMode: 0 = Bearbeitet, 1 = Erstellt, 2 = Zugegriffen
    If $sPath = "" OR $iMode > 2 OR $iMode < 0 Or $iDays < 0 Or $iDays = "" THen Return SetError(1)
    $aArray = _GetFilesFolder_Rekursiv($sPath)
    For $i = 1 to $aArray[0]
    $aTime = FileGetTime($aArray[$i],$iMode)
    If Not @error Then
    If _DateDiff("D",$aTime[0]&"/"&$aTime[1]&"/"&$aTime[2]&" "&$aTime[3]&":"&$aTime[4]&":"&$aTime[5],_NowCalc()) > $iDays Then
    If StringInStr(FileGetAttrib($aArray[$i]),"R") Then
    FileSetAttrib($aArray[$i],"-R",1)
    EndIf
    If StringInStr(FileGetAttrib($aArray[$i]),"D",1) Then
    DirRemove($aArray[$i])
    ConsoleWrite("+> "&$aArray[$i] & @CRLF)
    Else
    FileDelete($aArray[$i])
    ConsoleWrite("-> "&$aArray[$i] & @CRLF)
    EndIf
    If @error Then SetError(2) ; Nicht alle Dateien konnten gelöscht werden.
    EndIf
    EndIf
    Next
    EndFunc

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

    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
    ; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
    ; optional: $iRetType 0 gibt Array, 1 gibt String zurück
    ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
    ; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
    ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
    ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    Case '3'
    $sDelim = ';'
    Case '4'
    $sDelim = '|'
    Case Else
    $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
    EndFunc

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

    Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc

    [/autoit]
    • Offizieller Beitrag


    Und ich dachte autoit sollte eine Erleichterung darstellen...
    Ich glaube ich versuche es doch erst mal mit einem *einfachen* Batch-Programm.

    Trotzdem vielen Dank für Deine Unterstützung.

    Aller Anfag ist schwer.
    Daher sollte man manchmal garnicht erst anfangen ;)

    Wenn Dir das zu schwer ist, dann habe ich hier eine Funktion für Dich. :)

  • dann will ich aber auch noch "DAODelete" vorstellen :

    Spoiler anzeigen
    [autoit]

    ; Programmname: DOADelete.au3
    ; Version: 1.01
    ; geschrieben von: micha_he
    ; geschrieben am: 07.07.2007
    ;
    ; Beschreibung:
    ;
    ; Das Programm dient dazu Ordner und Dateien die ein gewisses
    ; Alter erreicht haben, zu löschen.
    ;
    ; Der Programmaufruf lautet wie folgt:
    ;
    ; DOADelete.exe [Alter in Tagen (optional)] [Ordner 1 (optional)] [Ordner X (optional)]

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

    AutoItSetOption ("MustDeclareVars",1)

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

    #include <date.au3>
    Dim $i, $Ordner, $Alter, $AnzahlPfade

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

    If $CmdLine[0] > 0 Then
    If Number($CmdLine[1]) > 0 Then
    $alter = $CmdLine[1]
    Else
    $alter = 1
    EndIf
    Else
    $alter = 1
    EndIf

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

    If $CmdLine[0] > 1 Then
    $AnzahlPfade = $CmdLine[0] - 1
    Dim $Pfad[$AnzahlPfade]
    For $i = 0 to $AnzahlPfade - 1
    $pfad[$i] = $CmdLine[$i + 2]
    Next
    Else
    $AnzahlPfade = 7
    Dim $pfad[$AnzahlPfade]
    $pfad[0] = @userprofiledir & "\Netzwerkumgebung\"
    $pfad[1] = @userprofiledir & "\Temporary Internet Files\"
    $pfad[2] = @userprofiledir & "\Local Settings\Temp\"
    $pfad[3] = @userprofiledir & "\Lokale Einstellungen\Temp\"
    $pfad[4] = @userprofiledir & "\Lokale Einstellungen\Temporary Internet Files\"
    $pfad[5] = @windowsdir & "\Temp\"
    $pfad[6] = @windowsdir & "\Temporary Internet Files\"
    EndIf

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

    for $i = 0 to $AnzahlPfade - 1
    $ordner = $pfad[$i]
    _DateiLoeschenRekursiv($ordner,$alter)
    next

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

    ; Ende Hauptprogramm

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

    ; Hier beginnt die Löschfunktion "_DateiLoeschenRekursiv()"
    Func _DateiLoeschenRekursiv($ordner, $alter)
    Dim $dat, $datcalc, $datdiff, $search, $search2, $file
    If StringRight($ordner,1) <> "\" Then $ordner &= "\"
    $search = FileFindFirstFile($ordner & "*.*")
    While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    If StringInStr(FileGetAttrib($ordner & $file),"D") > 0 Then
    _DateiLoeschenRekursiv($ordner & $file & "\", $alter)
    $search2 = FileFindFirstFile($ordner & $file & "\*.*")
    If @error = 1 then
    FileClose($search2)
    FileSetAttrib ($ordner & $file,"-RSH")
    DirRemove($ordner & $file)
    EndIf
    Else
    $dat = FileGetTime($ordner & $file,0,1)
    $datcalc = StringMid($dat,1,4) & "/" & StringMid($dat,5,2) & "/" & StringMid($dat,7,2) & " " & StringMid($dat,9,2) & ":" & StringMid($dat,11,2) & ":" & StringMid($dat,13,2)
    $datdiff = _DateDiff("D",$datcalc,_NowCalc())
    If $datdiff >= $alter then
    FileSetAttrib ($ordner & $file,"-RSH")
    FileDelete($ordner & $file)
    EndIf
    Endif
    Wend
    FileClose($search)
    Endfunc
    ; Ende der Funktion

    [/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"

    • Offizieller Beitrag

    Micha_he: diese Zeile:

    [autoit]

    If StringInStr(FileGetAttrib($ordner & $file),"D") > 0 Then

    [/autoit]


    kann man ab AutoIt-Version 3.3.2.0 jetzt so schreiben:

    [autoit]

    If @extended Then

    [/autoit]


    weil FileFindNextFile dort jetzt eine "1" zurückgibt, wenn es sich um ein Verzeichnis handelt.

    und Dein:

    [autoit]

    FileClose($search2)

    [/autoit]


    muss sich außerhalb der If...EndIf-Anweisung befinden, sonst wird das Filehandle nicht geschlossen, wenn kein Fehler auftritt.
    Die Idee mit dem löschen des leeren Verzeichnisses hatte ich auch erst, aber dann dachte ich, eigentlich will man doch nur die alten Dateien loswerden, nicht die Ordnerstruktur. :S
    Obwohl könnte man optional machen...
    Das mit dem setzen der Attribute finde ich etwas "zuviel am Anwender vorbei". Eigentlich setzt man das "r"-Flag ja gerade, um eine Datei vor dem (ungewollten) löschen zu schützen.

  • Oscar :

    Zitat

    kann man ab AutoIt-Version 3.3.2.0 jetzt so schreiben:

    Das mag sein. Ich habe das Script nur aus den Unmengen von älteren Ideen und Umsetzungen herausgegraben und dabei nicht auf die Aktualität geachtet.

    Zitat

    Die Idee mit dem löschen des leeren Verzeichnisses hatte ich auch erst, aber dann dachte ich, eigentlich will man doch nur die alten Dateien loswerden, nicht die Ordnerstruktur.

    Das ist natürlich auch richtig. Aber wie Du vielleicht aus den Default-Verzeichnissen erkannt hast, dient(e) das Script zum Aufräumen von Ordner. Unter anderem von Ordner auf denen User Ihrer Spielereien ausgelebt haben :D

    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 (28. Dezember 2009 um 21:42)