mukraker
Goto Top

Alte Ordnerinhalte automatisch löschen

3-Tage alte Dateien löschen

Hallo auf meinem Server liegt ein Ordner für den internen Datenaustausch.

Ich möchte gerne jeden Abend automatisch Dateien löschen, die älter als 3 Tage sind.

Wie gehe ich vor?

Content-Key: 77853

Url: https://administrator.de/contentid/77853

Ausgedruckt am: 28.03.2024 um 22:03 Uhr

Mitglied: stbewo
stbewo 11.01.2008 um 09:47:48 Uhr
Goto Top
Hallo mukraker,

indem du dich alle 3 Tage nachts um 24 Uhr vor den Server setzt um die Verzeichnisse zu löschen face-wink

Erstelle doch einfach einen "Schedulded Task" der einen Batch Job startet.

Gruß
Stefan
Mitglied: mukraker
mukraker 11.01.2008 um 10:39:56 Uhr
Goto Top
Wie sieht denn der Batch Job aus?

Mit "del *.*" ist es ja noch nicht getan
Mitglied: rubberduck
rubberduck 11.01.2008 um 10:50:05 Uhr
Goto Top
Wie bereits von stbewo geschrieben, einen Shedule-Task (als lokalen Dienst ausführen lassen) erstellen und untenstehendes VBS ausführen lassen (Dateialter ist in Zeile 3).
Ist bei uns übrigens seit einem Jahr im Einsatz und funktioniert tadellos. face-smile
*Räusper* Ist ja auch von mir... 0face-smile

Falls es noch nicht gehen sollte, liegt es daran, dass ich noch einige Geschäftliche Sachen rausgehauen habe. Einfach melden.

Public file, subfolder, myShell, myFiles, objFSO, Durchlauf

Public Const TransferAlter 3 'Dateialter
Public Const sFolder "d:\OrdnerMitAltenEintraegen"

mypath = cstr(Left(WScript.ScriptFullName, InStrRev(WScript.ScriptFullName, "\")))

Dim oFSO: Set oFSO = CreateObject("Scripting.FileSystemObject")
Dim oAntwort: Set oAntwort = oFSO.CreateTextFile(mypath & "d.txt", True): oAntwort.Close
Dim sAntwort: Set sAntwort = oFSO.OpenTextFile(mypath & "d.txt", 2)
On Error Resume Next

Call sAntwort.Write("D")
Call sAntwort.Close

DoFiles oFSO.GetFolder(sFolder), TransferAlter, 1

Call oFSO.DeleteFile(mypath & "d.txt")

Sub DoFiles(Folder, Alter, Durchlauf)
On Error Resume Next

Dim fso: Set oFSO = CreateObject("Scripting.FileSystemObject")
Dim oFolder: Set oFolder = oFSO.GetFolder(Folder)
Dim osFolder: Set osFolder = oFolder.SubFolders

For Each file In oFolder.Files
If DateDiff("m", file.DateCreated, Now) > Alter Then Beenden file: DelFile file, Durchlauf
Next

For Each osFolder In oFolder.SubFolders
DoFiles osFolder, Alter, Durchlauf
If DateDiff("m", osFolder.DateCreated, Now) > Alter And osFolder.Files.Count = 0 Then Beenden osFolder: DelFolder osFolder, Durchlauf
Next

End Sub

Function Beenden(file)
Set myShell = CreateObject("Wscript.Shell")
myShell.Run "cmd.exe /c openfiles /Disconnect /OP " & file & " /ID *", 0, True
End Function

Function DelFile(file, Durchlauf)
On Error Resume Next
Set myShell = CreateObject("Wscript.Shell")

fName = file
file.Delete True
End Function

Function DelFolder(subfolder, Durchlauf)
On Error Resume Next
strfolder = subfolder
subfolder.Delete True
End Function
Mitglied: mukraker
mukraker 11.01.2008 um 11:11:17 Uhr
Goto Top
hui, das hätte ich mir einfacher vorgestellt.
Mitglied: gemini
gemini 11.01.2008 um 11:11:18 Uhr
Goto Top
Hallo mukraker,

mit nem Batch kann ich nicht dienen.
Hier ein VBS mit Logging.
''--------------------------------------------------------------------------------------  
'' Dateien anhand des Alters löschen :::::::::::::::::::::::::::::::::::::::::::::::::::  
''--------------------------------------------------------------------------------------  
'' Erwartet 2 Parameter mit den Schaltern -f und -t direkt gefolgt von den Werten ::::::  
'' -f Startverzeichnis für die rekursive Suche :::::::::::::::::::::::::::::::::::::::::  
'' -t Alter der Dateien in Tagen :::::::::::::::::::::::::::::::::::::::::::::::::::::::  
''--------------------------------------------------------------------------------------  
Option Explicit 
'On Error Resume Next   

Const blnOverWrite = TRUE
Const blnNoOverWrite = FALSE
Const blnWait4Return = TRUE
Const blnNoWait4Return = FALSE

Dim WshNetwork
Dim WshShell
Dim objFSO
Dim objFolder
Dim objSubFld
Dim objLog
Dim objArgs
Dim f1
Dim f2
Dim colFiles
Dim arrDate
Dim strScriptName
Dim strCompName
Dim strExt
Dim strStart				'Startverzeichnis für die rekursive Suche  
Dim strMSG
Dim strRelPath
Dim strLog
Dim strLogFile
Dim strTemp
Dim intTTL					'Alter der Dateien in Tagen  
Dim i
Dim j

Set WshShell = WScript.CreateObject("WScript.Shell")  
Set WshNetwork = Wscript.CreateObject("WScript.Network")  
Set objFSO = CreateObject("Scripting.FileSystemObject")   
Set objArgs = WScript.Arguments

strScriptName = Wscript.ScriptName
strCompName = WshNetwork.ComputerName
strExt = ".log"  
strLog = "\\<server>\>share>\"  
j = 1
strMSG = "Scriptname: " & vbTab & strScriptName & vbCrLf & "gestartet auf: " & vbTab & _  
	strCompName & vbCrLf & "gestartet am: " & vbTab & WeekdayName(Weekday(Date)) & ", " & _  
	Now & vbCrLf

If objArgs.Count = 2 Then
	Dim Item
	For Each Item in objArgs
		Select Case Left(Item, 2)
		Case "-f"  
			strStart = CStr(Right(Item, Len(Item) - 2))
			strMSG = strMSG & "Startverzeichnis: " & vbTab & strStart & vbCrLf  
		Case "-t"  
			intTTL = CInt(Right(Item, Len(Item) - 2))
			strMsg = strMSG & "Kriterium: " & vbTab & intTTL & " Tage" & vbCrLf  
		End Select
	Next

strMsg = strMsg & "_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_" & vbCrLf  

	If ChkFolder(strStart) Then
			Main(strStart)
	Else
		MsgBox "Argument """ & strStart & """ ungültig - Abbruch"  
		strMsg = strMsg & "Argument """ & strStart & """ ungültig - Abbruch" & vbCrLf  
		WriteLog strLog, strMSG
	End If
Else	
	strMsg = strMsg & "Falsche Anzahl an Argumenten (" & objArgs.Count & _  
		" von 2) - Abbruch" & vbCrLf  
	WriteLog strLog, strMSG
	MsgBox "Falsche Anzahl an Argumenten (" & objArgs.Count & " von 2) - Abbruch"  
End If

Sub Main(Startfolder)
If ChkFolder(strLog) = TRUE Then 'das Ziel für das Logfile  
	strMSG = strMSG & vbCrLf & "#" & vbTab & "RelativePath" & vbTab & "//" & vbTab & _  
		"DateCreated" & vbTab & "//" & vbTab & "LastModified" & vbTab & "//" & vbTab & _  
		"LastAccessed" & vbTab & "//" & vbTab & "Action"  
	j = 0
	ListFolder StartFolder
	strMSG = strMSG & vbCrLf & vbCrLf & _
		"_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_" & vbCrLf & _  
		j & " Dateien gelöscht" & vbCrLf & "beendet am: " & vbTab & _  
		WeekdayName(Weekday(Date)) & ", " & Now  
	WriteLog strLog, strMSG
End If
End Sub

Function ChkFolder(Path2Folder)
ChkFolder = FALSE
If objFSO.FolderExists(Path2Folder) Then
	ChkFolder = TRUE
End If
End Function

Function ChkFile(Path2File)
ChkFile = FALSE
If objFSO.FileExists(Path2File) Then
	ChkFile = TRUE
End If
End Function

Private Sub ListFolder(StartFolder)
Set objFolder = objFSO.GetFolder(StartFolder)
ListFiles objFolder
Set objSubFld = objFolder.SubFolders
For Each f2 in objSubFld 
	ListFolder f2 
Next
End Sub

Private Sub CopyFlsFld(Src, Dst, Overwrite)
Dim objSrc
Set objSrc = objFSO.GetFile(Src)
objSrc.Copy Dst, Overwrite
End Sub

Private Sub ListFiles(Start) 
Set colFiles = Start.Files
For Each f1 in colFiles
	If DateDiff("d", f1.DateCreated, Date) > intTTL Then  
		strRelPath = Right(objFSO.GetAbsolutePathName(f1), _
		Len(objFSO.GetAbsolutePathName(f1)) - Len(strStart))
		strMSG = strMSG & vbCrLf & j + 1 & vbTab & strRelPath & vbTab & "//" & vbTab & f1.DateCreated & _  
		vbTab & "//" & vbTab &  f1.DateLastModified  & vbTab & "//" & vbTab & _  
		f1.DateLastAccessed & vbTab & "//" & vbTab & "gelöscht"  
		objFSO.DeleteFile(f1)
		j = j + 1
	End If 
Next
End Sub 

Private Sub WriteLog(strLog, Report)
Set objLog = objFSO.CreateTextFile(GenerateFileName, blnNoOverWrite) 
objLog.Write Report
objLog.Close
End Sub

Function GenerateFileName()
arrDate = Split(FormatDateTime(Date, 2),".")  
strLogFile = strCompName & "_" & strScriptName & "_" & arrDate(2) & "." & arrDate(1) & "." & arrDate(0)  
strTemp = strLogFile
For i = 1 To 999
	If objFSO.FileExists(strLog & strLogFile & strExt) Then
		strLogFile = strTemp & "_" & String(3 - Len(i), "0") & i  
	Else
		GenerateFileName = strLog & strLogFile & strExt
  	Exit Function
	End If
Next
End Function

Set WshNetwork = Nothing
Set WshShell = Nothing
Set objFSO = Nothing
Set objFolder = Nothing
Set objSubFld = Nothing
Set objLog = Nothing
Set objArgs = Nothing
f1 = ""  
f2 = ""  
colFiles = ""  
arrDate = ""  
strScriptName = ""  
strCompName = ""  
strExt = ""  
strStart = ""  
strMSG = ""  
strRelPath = ""  
strLog = ""  
strLogFile = ""  
strTemp = ""  
intTTL = ""  
i  = ""  
j = ""  
Wscript.Quit

HTH,
gemini

PS: War wieder einer schneller face-wink
Mitglied: stbewo
stbewo 11.01.2008 um 11:22:19 Uhr
Goto Top
Einfacher Lösungsvorschlag:

Du kannst mit Attrib das Archiv Flag aller Files auf "On" setzen
und anschl. mit xcopy /M /D:m-d-y > NUL das Archiv Flag der
gesuchten Files auf "OFF" setzen.

Mit del *.* /AA /s werden dann die Files gelöscht, deren Archiv Attribut "Off" ist.

Gruß
Stefan
Mitglied: rubberduck
rubberduck 11.01.2008 um 11:22:35 Uhr
Goto Top
@gemini
Passiert mir auch andauernd face-wink
Hübsch das mit dem Logging. Hab ich Extra weggelassen, da ich sonst bei ca. 200 Zeilen Code wäre (Log ist eh individuell). Ich Logge normalerweise in eine HTML-Datei.

@mukraker
Tja, wenn es Dateien in Unterordnern hat, muss man das ganze rekursiv machen um diese zu erwischen.
Batchmässig brichst Du Dir beide Beine und einen Arm alleine beim Versuch so was zu erstellen
face-smile

Sieht vielleicht kompliziert aus, ist aber eigentlich ganz einfach face-wink
Mitglied: stbewo
stbewo 11.01.2008 um 11:23:43 Uhr
Goto Top
Einfacher Lösungsvorschlag:

Du kannst mit Attrib das Archiv Flag aller Files auf "On" setzen
und anschl. mit xcopy /M /D:m-d-y > NUL das Archiv Flag der
gesuchten Files auf "OFF" setzen.

Mit del *.* /AA /s werden dann die Files gelöscht, deren Archiv Attribut "Off" ist.

Gruß
Stefan
Mitglied: rubberduck
rubberduck 11.01.2008 um 11:27:59 Uhr
Goto Top
Cool. Auf diese Idee wäre ich nicht gekommen.

Wie ist eigentlich das Verhalten, wenn da ein Backup drüber geht? So wegen Archiv-Bit.
Den gibts ja nicht grundlos(?).
Mitglied: mukraker
mukraker 11.01.2008 um 11:44:56 Uhr
Goto Top
Muss ich das so im Script ausfüllen? Oder wo gebe ich die Werte an?

Dim strStart = "d:\ordnername"
Dim intTTL = 3


Danke?
Mitglied: stbewo
stbewo 11.01.2008 um 11:45:15 Uhr
Goto Top
Die Backup Software setzt nach der Sicherung das Archiv Bit auf "On". Wenn Du die Datei änderst, wird das Archiv Bit auf "Off" gesetzt.

Gruß
Stefan
Mitglied: mukraker
mukraker 11.01.2008 um 11:49:13 Uhr
Goto Top
So richtig?:


C:\Tasks\deleteTransfer.vbs -f "d:\tmpDaten"-t 3
Mitglied: rubberduck
rubberduck 11.01.2008 um 12:22:57 Uhr
Goto Top
Noch eine letzte Frage.
Er will ja nicht alle Files löschen. Wo gibst Du mit, dass nur Files gelöscht werden, die älter als 3 Tage sind?
Mitglied: stbewo
stbewo 11.01.2008 um 12:39:03 Uhr
Goto Top
Das Archiv Attribut wird durch den XCOPY Job auf "Off" gesetzt und nur die Files werden gelöscht, die kein Archiv Bit haben.

Gruß
Stefan
Mitglied: rubberduck
rubberduck 11.01.2008 um 12:49:16 Uhr
Goto Top
Aha...

Dann müsste man aber jedes einzelne File angeben, oder sehe ich das falsch?
Es kann ja sein, dass in einem Ordner ein paar Files gelöscht werden müssen und ein paar nicht...dasselbe in den restlichen 8000 Ordnern.

Nochmal:
Wie finde ich mit einem Batch raus welche Files älter als 3 Tage sind und verarbeite diese weiter (Pipe oder FOR-Schleife)?

Ich will Dich nicht herausfordern, aber wenn man es einfacher machen kann, dann interressiert mich das und ich will es begreifen.
Als Sysadmin will man ja auch mal Zeit für andere Sachen haben face-wink

Ach ja, das Log das gemini so hübsch reingepackt hat, geht das mit Deiner Variante auch?
Mitglied: gemini
gemini 11.01.2008 um 12:55:25 Uhr
Goto Top
C:\Tasks\deleteTransfer.vbs -f "d:\tmpDaten"-t 3
Fast! Wie in der Kopfzeile beschrieben "Erwartet 2 Parameter mit den Schaltern -f und -t direkt gefolgt von den Werten". KEINE Leerzeichen zwischen Schalter und Wert.

Also im Taskmanager:
C:\Tasks\deleteTransfer.vbs -fd:\tmpDaten -t3



Der Grund dafür liegt darin, dass das Script zentral auf einem Server liegt, aber auf verschiedenen Rechnern ausgeführt wird.
Darum schauts bei mir auch eher so aus
\\<server>\<share>\deleteTransfer.vbs -fd:\tmpDaten\ -t3

Das Logfile wird dann zentral auf einen Serverpfad geschrieben und entspr. benamt.
War natürlich Blödsinn was da aus der Tastatur gekommen ist face-wink
Hier ist's richtig dargestellt


Gruß,
gemini
Mitglied: mukraker
mukraker 22.01.2008 um 09:06:39 Uhr
Goto Top
C:\Tasks\deleteTransfer.vbs -fd:\04_Transfer -t3

Das läuft jetzt seit einer Woche und noch NIE wurde eine Datei gelöscht.
Muss ich was mit diesem server><share machen?
Bei mir läuft alles Lokal!

Was mache ich falsch?
Mitglied: gemini
gemini 22.01.2008 um 23:20:00 Uhr
Goto Top
C:\Tasks\deleteTransfer.vbs -fd:\04_Transfer -t3
Das läuft jetzt seit einer Woche und noch NIE wurde eine Datei gelöscht.
Whoops, da ist mir ein Fehler unterlaufen. Sorry!
Du musst natürlich einen Geplanten Task dafür anlegen.
In dem Feld 'Ausführen' schreibst du, falls das Script in C:\Tasks\ liegt, folgendes:
C:\WINDOWS\system32\wscript.exe C:\Tasks\deleteTransfer.vbs -fd:\tmpDaten -t3

Muss ich was mit diesem server><share machen?
Bei mir läuft alles Lokal!
In diesen Pfad wird das Logfile abgelegt.

Gruß,
gemini
Mitglied: mukraker
mukraker 28.01.2008 um 10:54:38 Uhr
Goto Top
irgendwie ist der Wurm drin:

Starten: C:\WINNT\system32\wscript.exe C:\Tasks\deleteTransfer.vbs -fd:\04_Transfer -t3
Ausführen in: C:\WINNT\system32\

es passiert einfach nichts face-sad
Mitglied: stbewo
stbewo 28.01.2008 um 12:40:22 Uhr
Goto Top
Hi,

zwischenzeitlich habe ich mir auch noch mal ein paar Gedanken gemacht. Die ATTRIB Lösung hat den Nachteil, dass bei einer Datensicherung, die Files als zu sichern angesehen werden und somit komplett gesichert werden (schlecht).

Bei dem NT-Ressource Kit gibt es ein ForFiles.EXE mit dem man so einiges anstellen kann. Hier kann man (unter anderem) Datums-Filter definieren und z.B. Files/Folder nach ihrem Datum Löschen.
Die Syntax ist etwas abgehoben, aber hier ein Beispiel:

Forfiles -p "<path>" -s -m *.* -d -10 -c "Cmd /C del @File"

Hier werden alle Files älter 10 Tage gelöscht.

Es gibt scheinbar 2 Versionen mit unterschiedlichen Parametern. Hier ist die Version, deren Syntax in der MS-Hilfe beschrieben ist.

http://www.petri.co.il/download_free_reskit_tools.htm


Gruß
Stefan