Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Alte Ordnerinhalte automatisch löschen

Frage Microsoft Windows Server

Mitglied: mukraker

mukraker (Level 1) - Jetzt verbinden

11.01.2008, aktualisiert 28.01.2008, 5935 Aufrufe, 20 Kommentare

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?
Mitglied: stbewo
11.01.2008 um 09:47 Uhr
Hallo mukraker,

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

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

Gruß
Stefan
Bitte warten ..
Mitglied: mukraker
11.01.2008 um 10:39 Uhr
Wie sieht denn der Batch Job aus?

Mit "del *.*" ist es ja noch nicht getan
Bitte warten ..
Mitglied: rubberduck
11.01.2008 um 10:50 Uhr
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.

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
Bitte warten ..
Mitglied: mukraker
11.01.2008 um 11:11 Uhr
hui, das hätte ich mir einfacher vorgestellt.
Bitte warten ..
Mitglied: gemini
11.01.2008 um 11:11 Uhr
Hallo mukraker,

mit nem Batch kann ich nicht dienen.
Hier ein VBS mit Logging.
01.
''-------------------------------------------------------------------------------------- 
02.
'' Dateien anhand des Alters löschen ::::::::::::::::::::::::::::::::::::::::::::::::::: 
03.
''-------------------------------------------------------------------------------------- 
04.
'' Erwartet 2 Parameter mit den Schaltern -f und -t direkt gefolgt von den Werten :::::: 
05.
'' -f Startverzeichnis für die rekursive Suche ::::::::::::::::::::::::::::::::::::::::: 
06.
'' -t Alter der Dateien in Tagen ::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
07.
''-------------------------------------------------------------------------------------- 
08.
Option Explicit  
09.
'On Error Resume Next  
10.
 
11.
Const blnOverWrite = TRUE 
12.
Const blnNoOverWrite = FALSE 
13.
Const blnWait4Return = TRUE 
14.
Const blnNoWait4Return = FALSE 
15.
 
16.
Dim WshNetwork 
17.
Dim WshShell 
18.
Dim objFSO 
19.
Dim objFolder 
20.
Dim objSubFld 
21.
Dim objLog 
22.
Dim objArgs 
23.
Dim f1 
24.
Dim f2 
25.
Dim colFiles 
26.
Dim arrDate 
27.
Dim strScriptName 
28.
Dim strCompName 
29.
Dim strExt 
30.
Dim strStart				'Startverzeichnis für die rekursive Suche 
31.
Dim strMSG 
32.
Dim strRelPath 
33.
Dim strLog 
34.
Dim strLogFile 
35.
Dim strTemp 
36.
Dim intTTL					'Alter der Dateien in Tagen 
37.
Dim i 
38.
Dim j 
39.
 
40.
Set WshShell = WScript.CreateObject("WScript.Shell") 
41.
Set WshNetwork = Wscript.CreateObject("WScript.Network") 
42.
Set objFSO = CreateObject("Scripting.FileSystemObject")  
43.
Set objArgs = WScript.Arguments 
44.
 
45.
strScriptName = Wscript.ScriptName 
46.
strCompName = WshNetwork.ComputerName 
47.
strExt = ".log" 
48.
strLog = "\\<server>\>share>\" 
49.
j = 1 
50.
strMSG = "Scriptname: " & vbTab & strScriptName & vbCrLf & "gestartet auf: " & vbTab & _ 
51.
	strCompName & vbCrLf & "gestartet am: " & vbTab & WeekdayName(Weekday(Date)) & ", " & _ 
52.
	Now & vbCrLf 
53.
 
54.
If objArgs.Count = 2 Then 
55.
	Dim Item 
56.
	For Each Item in objArgs 
57.
		Select Case Left(Item, 2) 
58.
		Case "-f" 
59.
			strStart = CStr(Right(Item, Len(Item) - 2)) 
60.
			strMSG = strMSG & "Startverzeichnis: " & vbTab & strStart & vbCrLf 
61.
		Case "-t" 
62.
			intTTL = CInt(Right(Item, Len(Item) - 2)) 
63.
			strMsg = strMSG & "Kriterium: " & vbTab & intTTL & " Tage" & vbCrLf 
64.
		End Select 
65.
	Next 
66.
 
67.
strMsg = strMsg & "_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_" & vbCrLf 
68.
 
69.
	If ChkFolder(strStart) Then 
70.
			Main(strStart) 
71.
	Else 
72.
		MsgBox "Argument """ & strStart & """ ungültig - Abbruch" 
73.
		strMsg = strMsg & "Argument """ & strStart & """ ungültig - Abbruch" & vbCrLf 
74.
		WriteLog strLog, strMSG 
75.
	End If 
76.
Else	 
77.
	strMsg = strMsg & "Falsche Anzahl an Argumenten (" & objArgs.Count & _ 
78.
		" von 2) - Abbruch" & vbCrLf 
79.
	WriteLog strLog, strMSG 
80.
	MsgBox "Falsche Anzahl an Argumenten (" & objArgs.Count & " von 2) - Abbruch" 
81.
End If 
82.
 
83.
Sub Main(Startfolder) 
84.
If ChkFolder(strLog) = TRUE Then 'das Ziel für das Logfile 
85.
	strMSG = strMSG & vbCrLf & "#" & vbTab & "RelativePath" & vbTab & "//" & vbTab & _ 
86.
		"DateCreated" & vbTab & "//" & vbTab & "LastModified" & vbTab & "//" & vbTab & _ 
87.
		"LastAccessed" & vbTab & "//" & vbTab & "Action" 
88.
	j = 0 
89.
	ListFolder StartFolder 
90.
	strMSG = strMSG & vbCrLf & vbCrLf & _ 
91.
		"_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_" & vbCrLf & _ 
92.
		j & " Dateien gelöscht" & vbCrLf & "beendet am: " & vbTab & _ 
93.
		WeekdayName(Weekday(Date)) & ", " & Now 
94.
	WriteLog strLog, strMSG 
95.
End If 
96.
End Sub 
97.
 
98.
Function ChkFolder(Path2Folder) 
99.
ChkFolder = FALSE 
100.
If objFSO.FolderExists(Path2Folder) Then 
101.
	ChkFolder = TRUE 
102.
End If 
103.
End Function 
104.
 
105.
Function ChkFile(Path2File) 
106.
ChkFile = FALSE 
107.
If objFSO.FileExists(Path2File) Then 
108.
	ChkFile = TRUE 
109.
End If 
110.
End Function 
111.
 
112.
Private Sub ListFolder(StartFolder) 
113.
Set objFolder = objFSO.GetFolder(StartFolder) 
114.
ListFiles objFolder 
115.
Set objSubFld = objFolder.SubFolders 
116.
For Each f2 in objSubFld  
117.
	ListFolder f2  
118.
Next 
119.
End Sub 
120.
 
121.
Private Sub CopyFlsFld(Src, Dst, Overwrite) 
122.
Dim objSrc 
123.
Set objSrc = objFSO.GetFile(Src) 
124.
objSrc.Copy Dst, Overwrite 
125.
End Sub 
126.
 
127.
Private Sub ListFiles(Start)  
128.
Set colFiles = Start.Files 
129.
For Each f1 in colFiles 
130.
	If DateDiff("d", f1.DateCreated, Date) > intTTL Then 
131.
		strRelPath = Right(objFSO.GetAbsolutePathName(f1), _ 
132.
		Len(objFSO.GetAbsolutePathName(f1)) - Len(strStart)) 
133.
		strMSG = strMSG & vbCrLf & j + 1 & vbTab & strRelPath & vbTab & "//" & vbTab & f1.DateCreated & _ 
134.
		vbTab & "//" & vbTab &  f1.DateLastModified  & vbTab & "//" & vbTab & _ 
135.
		f1.DateLastAccessed & vbTab & "//" & vbTab & "gelöscht" 
136.
		objFSO.DeleteFile(f1) 
137.
		j = j + 1 
138.
	End If  
139.
Next 
140.
End Sub  
141.
 
142.
Private Sub WriteLog(strLog, Report) 
143.
Set objLog = objFSO.CreateTextFile(GenerateFileName, blnNoOverWrite)  
144.
objLog.Write Report 
145.
objLog.Close 
146.
End Sub 
147.
 
148.
Function GenerateFileName() 
149.
arrDate = Split(FormatDateTime(Date, 2),".") 
150.
strLogFile = strCompName & "_" & strScriptName & "_" & arrDate(2) & "." & arrDate(1) & "." & arrDate(0) 
151.
strTemp = strLogFile 
152.
For i = 1 To 999 
153.
	If objFSO.FileExists(strLog & strLogFile & strExt) Then 
154.
		strLogFile = strTemp & "_" & String(3 - Len(i), "0") & i 
155.
	Else 
156.
		GenerateFileName = strLog & strLogFile & strExt 
157.
  	Exit Function 
158.
	End If 
159.
Next 
160.
End Function 
161.
 
162.
Set WshNetwork = Nothing 
163.
Set WshShell = Nothing 
164.
Set objFSO = Nothing 
165.
Set objFolder = Nothing 
166.
Set objSubFld = Nothing 
167.
Set objLog = Nothing 
168.
Set objArgs = Nothing 
169.
f1 = "" 
170.
f2 = "" 
171.
colFiles = "" 
172.
arrDate = "" 
173.
strScriptName = "" 
174.
strCompName = "" 
175.
strExt = "" 
176.
strStart = "" 
177.
strMSG = "" 
178.
strRelPath = "" 
179.
strLog = "" 
180.
strLogFile = "" 
181.
strTemp = "" 
182.
intTTL = "" 
183.
i  = "" 
184.
j = "" 
185.
Wscript.Quit
HTH,
gemini

PS: War wieder einer schneller
Bitte warten ..
Mitglied: stbewo
11.01.2008 um 11:22 Uhr
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
Bitte warten ..
Mitglied: rubberduck
11.01.2008 um 11:22 Uhr
@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
Bitte warten ..
Mitglied: stbewo
11.01.2008 um 11:23 Uhr
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
Bitte warten ..
Mitglied: rubberduck
11.01.2008 um 11:27 Uhr
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(?).
Bitte warten ..
Mitglied: mukraker
11.01.2008 um 11:44 Uhr
Muss ich das so im Script ausfüllen? Oder wo gebe ich die Werte an?

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


Danke?
Bitte warten ..
Mitglied: stbewo
11.01.2008 um 11:45 Uhr
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
Bitte warten ..
Mitglied: mukraker
11.01.2008 um 11:49 Uhr
So richtig?:


C:\Tasks\deleteTransfer.vbs -f "d:\tmpDaten"-t 3
Bitte warten ..
Mitglied: rubberduck
11.01.2008 um 12:22 Uhr
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?
Bitte warten ..
Mitglied: stbewo
11.01.2008 um 12:39 Uhr
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
Bitte warten ..
Mitglied: rubberduck
11.01.2008 um 12:49 Uhr
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?
Bitte warten ..
Mitglied: gemini
11.01.2008 um 12:55 Uhr
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
Hier ist's richtig dargestellt


Gruß,
gemini
Bitte warten ..
Mitglied: mukraker
22.01.2008 um 09:06 Uhr
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?
Bitte warten ..
Mitglied: gemini
22.01.2008 um 23:20 Uhr
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
Bitte warten ..
Mitglied: mukraker
28.01.2008 um 10:54 Uhr
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
Bitte warten ..
Mitglied: stbewo
28.01.2008 um 12:40 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
14 Tage alte Dateien automatisch löschen - Shell (1)

Frage von traller zum Thema Batch & Shell ...

Batch & Shell
gelöst Alte Daten automatisch per Zip erstellen (4)

Frage von BEBBYs zum Thema Batch & Shell ...

Exchange Server
gelöst W2011sbs - Exchange - gelöschte Mails automatisch löschen (8)

Frage von MG-One zum Thema Exchange Server ...

Exchange Server
Exchange 2013 pop3 Logs löschen sich nicht automatisch (3)

Frage von SpeakerST zum Thema Exchange Server ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (19)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...