mahatma84 Geschrieben 26. Oktober 2012 Teilen Geschrieben 26. Oktober 2012 Hallo zusammen, ich habe mich die letzten Tage immer wieder wieder mit Scripting auseinandergesetzt um hierfür eine Lösung zu erarbeiten. Google-Suche und Forumssuche brachten mich hier zwar immer ein Stück weiter aber nie ganz zum Erfolg. Ziel: Ein Löschscript, das Dateien und Verzeichnisse nach Anzahl X Tagen inkrementell löscht. "Vorraussetzungen": - lauffähig auf Windows-Server-Systemen (Win 2k3 - W2k8 R2) - keine zusätzlich benötigte Software (wenn dann Win-interne Mittel -> Ressource Kit, z.b. robocopy) - möglichst wenig Code Faul war ich nicht, deshalb kommen jetzt meine bisher getesten und eingesetzten Scripts: Mittels forfiles forfiles /p C:\temp /m *.* /s /d -20 /c "cmd /c del @path Fazit: meine favorisierte Lösung, hier fehlt aber das inkrementelle Löschen der Ordner Mittels VB '************************************************************ ' ' Löscht alle Dateien, die seit einem bestimmten Datum ' nicht mehr geändert wurden ' '************************************************************ '******* hier eigene Bedürfnissen anpassen ***************** Verzeichnis1 = "C:\Programme\Research In Motion\BlackBerry Enterprise Server\Logs" Verzeichnis2 = "C:\Programme\Research In Motion\BlackBerry Enterprise Server\BAS\jboss\ejb\server\default\data\wsdl" Verzeichnis3 = "C:\Programme\Research In Motion\BlackBerry Enterprise Server\BAS\jboss\ejb\server\default\tmp" Verzeichnis4 = "C:\Programme\Research In Motion\BlackBerry Enterprise Server\BAS\jboss\ejb\server\default\tmp\jbossws" Aufheben = 90 'Anzahl der Tage '********Ende der Anpassungen******************************** 'On Error Resume Next Verzeichnis1 Set fso = CreateObject("Scripting.FileSystemObject") Set ordner = fso.GetFolder(Verzeichnis1) heute = Date() DeleteInFolder(ordner) Sub DeleteInFolder(ordner) Set dateien = ordner.Files ' Alle Dateien in diesem Ordner abklappern For Each datei In dateien If datei.DateLastModified < (heute - Aufheben) Then datei.Delete End If Next Set untere = ordner.SubFolders 'Unterordner abklappern, DeleteInFolder rekursiv aufrufen For Each unter In untere DeleteInFolder(unter) Next End Sub 'On Error Resume Next Verzeichnis2 Set fso = CreateObject("Scripting.FileSystemObject") Set ordner = fso.GetFolder(Verzeichnis2) heute = Date() DeleteInFolder(ordner) Sub DeleteInFolder(ordner) Set dateien = ordner.Files ' Alle Dateien in diesem Ordner abklappern For Each datei In dateien If datei.DateLastModified < (heute - Aufheben) Then datei.Delete End If Next Set untere = ordner.SubFolders 'Unterordner abklappern, DeleteInFolder rekursiv aufrufen For Each unter In untere DeleteInFolder(unter) Next End Sub 'On Error Resume Next Verzeichnis3 Set fso = CreateObject("Scripting.FileSystemObject") Set ordner = fso.GetFolder(Verzeichnis3) heute = Date() DeleteInFolder(ordner) Sub DeleteInFolder(ordner) Set dateien = ordner.Files ' Alle Dateien in diesem Ordner abklappern For Each datei In dateien If datei.DateLastModified < (heute - Aufheben) Then datei.Delete End If Next Set untere = ordner.SubFolders 'Unterordner abklappern, DeleteInFolder rekursiv aufrufen For Each unter In untere DeleteInFolder(unter) Next End Sub 'On Error Resume Next Verzeichnis4 Set fso = CreateObject("Scripting.FileSystemObject") Set ordner = fso.GetFolder(Verzeichnis4) heute = Date() DeleteInFolder(ordner) Sub DeleteInFolder(ordner) Set dateien = ordner.Files ' Alle Dateien in diesem Ordner abklappern For Each datei In dateien If datei.DateLastModified < (heute - Aufheben) Then datei.Delete End If Next Set untere = ordner.SubFolders 'Unterordner abklappern, DeleteInFolder rekursiv aufrufen For Each unter In untere DeleteInFolder(unter) Next End Sub Fazit: einfach riesig und das inkrementelle Löschen der Ordner fehlt... Mittels robocopy mkdir C:\1 robocopy.exe C:\Programme\Research In Motion\BlackBerry Enterprise Server\Logs C:\1 /E /MOVE /MINAGE:90 /R:1 /W:1 robocopy.exe C:\Programme\Research In Motion\BlackBerry Enterprise Server\BAS\jboss\ejb\server\default\data\wsdl C:\1 /E /MOVE /MINAGE:90 /R:1 /W:1 robocopy.exe C:\Programme\Research In Motion\BlackBerry Enterprise Server\BAS\jboss\ejb\server\default\tmp C:\1 /E /MOVE /MINAGE:90 /R:1 /W:1 rmdir C:\1 Fazit: ebenfalls schlank, allerdings fehlt wieder, dass die Ordner rekursiv gelöscht werden und es wird zuvor alles wegkopiert Des weiteren würde mich mal intressieren wie das andere Administratoren handeln, denn dies ist ja eigentlich ein Standart-Problem und irgendwann läuft jede Platte mal voll.... :-) Für Tips und Verbesserungen bin ich sehr dankbar Grüßle Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
raiserle Geschrieben 26. Oktober 2012 Teilen Geschrieben 26. Oktober 2012 Ich habe mal für unsere CAD-Abteilung so ein Script geschrieben, welches die Daten aus dem lokalen Arbeitsbereich beim Shutdown sichert .... und alte Daten löscht. Der Auszug, der dich interessiert: ... rem anzahl von vorhandenen backups bestimmen FOR /F "tokens=4 skip=%SKIP%" %%a in ('dir /o-n %LETTER%:\%VAULTBACKUP%\') do ( IF /I NOT "%%a" == ".." IF /I NOT "%%a" == "." IF /I NOT "%%a" == "bytes" ( SET /a "COUNT+=1" rem echo test\%%a ) ) rem wenn anzahl von backups größer als maxbackups ist IF %COUNT% GTR %MAXBACKUP% (GOTO DELOLDVERSION) ELSE (GOTO DELNOTHING) :DELOLDVERSION rem skip um die anzahl von bleibenden backups erhöhen (werden nicht gelöscht) SET /a "SKIP+=%MAXBACKUP% rem verbleibende verzeichnise löschen FOR /F "tokens=4 skip=%SKIP%" %%a in ('dir /o-n %LETTER%:\%VAULTBACKUP%\') do ( IF /I NOT "%%a" == ".." IF /I NOT "%%a" == "." IF /I NOT "%%a" == "bytes" ( SET /a "COUNT+=1" rmdir /S /Q %LETTER%:\%VAULTBACKUP%\%%a ) ) :DELNOTHING ... Kann man, wenn man will: auch noch kürzen. Grüße Henrik Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mahatma84 Geschrieben 26. Oktober 2012 Autor Teilen Geschrieben 26. Oktober 2012 forfiles /p "C:\Programme\Research In Motion\BlackBerry Enterprise Server\Logs" /c "cmd /c if @isdir==TRUE RMDIR /S /Q @path" /d -90 forfiles /p "C:\Programme\Research In Motion\BlackBerry Enterprise Server\BAS\jboss\ejb\server\default\data\wsdl" /c "cmd /c if @isdir==TRUE RMDIR /S /Q @path" /d -90 forfiles /p "C:\Programme\Research In Motion\BlackBerry Enterprise Server\BAS\jboss\ejb\server\default\tmp" /c "cmd /c if @isdir==TRUE RMDIR /S /Q @path" /d -90 gefällt mir eigentlich echt gut läuft auf Win7, aber nicht unter W2k3 Standart :-( Danke Henrik, werde ich mir jetzt mal genauer anschauen :-) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SilentDemise Geschrieben 26. Oktober 2012 Teilen Geschrieben 26. Oktober 2012 Ich würde da die Powershell empfehlen. Aber was soll denn inkrementelles löschen sein? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mahatma84 Geschrieben 26. Oktober 2012 Autor Teilen Geschrieben 26. Oktober 2012 powershell wäre dann wohl der nächste Schritt... äh sorry nicht inkrementell, sondern rekursiv, mein Fehler, danke! Sprich Ordner, sowie Unterordner und die darin befindlichen Dateien sollen gelöscht werden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SilentDemise Geschrieben 26. Oktober 2012 Teilen Geschrieben 26. Oktober 2012 hm, das ist bisher ein einzeiler in der Powershell ... Definier mal das alter: Erstellung, letzter Lesezugriff, letzter Schreibzugriff? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mahatma84 Geschrieben 26. Oktober 2012 Autor Teilen Geschrieben 26. Oktober 2012 Alter = Erstellungsdatum da es sich lediglich um log-files handelt wäre dies so ok Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SilentDemise Geschrieben 26. Oktober 2012 Teilen Geschrieben 26. Oktober 2012 bestimmte Dateiendung? *.log, *.txt o.ä.? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mahatma84 Geschrieben 26. Oktober 2012 Autor Teilen Geschrieben 26. Oktober 2012 einfach alle Dateien und Ordner jeglicher Endung Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SilentDemise Geschrieben 26. Oktober 2012 Teilen Geschrieben 26. Oktober 2012 ist nur ein braindump aber sowas in der art sollte es sein function delete-logFiles( [string] $path, [string] $date ) { Get-ChildItem -recurse $path | Where-Object { $_.CreationTime.ToString("dd-mm-yyyy") -eq $date} | Remove-Item } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.