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?
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?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 77853
Url: https://administrator.de/forum/alte-ordnerinhalte-automatisch-loeschen-77853.html
Ausgedruckt am: 02.02.2025 um 17:02 Uhr
20 Kommentare
Neuester Kommentar
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.
*Räusper* Ist ja auch von mir... 0
Falls es noch nicht gehen sollte, liegt es daran, dass ich noch einige Geschäftliche Sachen rausgehauen habe. Einfach melden.
Ist bei uns übrigens seit einem Jahr im Einsatz und funktioniert tadellos.
*Räusper* Ist ja auch von mir... 0
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
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
Hallo mukraker,
mit nem Batch kann ich nicht dienen.
Hier ein VBS mit Logging.
HTH,
gemini
PS: War wieder einer schneller
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
@gemini
Passiert mir auch andauernd
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
Sieht vielleicht kompliziert aus, ist aber eigentlich ganz einfach
Passiert mir auch andauernd
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
Sieht vielleicht kompliziert aus, ist aber eigentlich ganz einfach
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
Ach ja, das Log das gemini so hübsch reingepackt hat, geht das mit Deiner Variante auch?
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
Ach ja, das Log das gemini so hübsch reingepackt hat, geht das mit Deiner Variante auch?
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.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.
\\<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
Hier ist's richtig dargestellt
Gruß,
gemini
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!Das läuft jetzt seit einer Woche und noch NIE wurde eine Datei gelöscht.
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.Bei mir läuft alles Lokal!
Gruß,
gemini
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
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