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
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:
-Dateien in Array lesen
-Für jede Datei im Array
->Wenn Erstelldatum älter als 90Tage -> Lösche Datei
Vill. hilft dir das.
Mfg
#include <Array.au3>
#include <Date.au3>
#include <File.au3>
;Root folder
$sourceFolder = @ScriptDir & '\'
;Gather files into an array
$fileList = _FileListToArray($sourceFolder, "*", 1)
Dim $found[1]
;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)
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:
#include <Date.au3>
_DeleteOld(@DesktopDir,90)
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
;==================================================================================================
; 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
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
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 :
; 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)]
AutoItSetOption ("MustDeclareVars",1)
[/autoit] [autoit][/autoit] [autoit]#include <date.au3>
Dim $i, $Ordner, $Alter, $AnzahlPfade
If $CmdLine[0] > 0 Then
If Number($CmdLine[1]) > 0 Then
$alter = $CmdLine[1]
Else
$alter = 1
EndIf
Else
$alter = 1
EndIf
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
for $i = 0 to $AnzahlPfade - 1
$ordner = $pfad[$i]
_DateiLoeschenRekursiv($ordner,$alter)
next
; 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
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:
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.
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 :
Zitatkann 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.
ZitatDie 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
Ich habe Deine Ideen mal "geklaut" und mit in mein Script (zu finden unter Scripte) eingebaut. Wirst auch als Author mit aufgeführt.