Aktionen

Windows:Dateien die älter sind als X Tage per Skript / Batch löschen

Aus znilwiki

1 Variante 1: forfiles

Nein, forfiles kannte ich auch noch nicht, scheint aber seit W2003 / XP dabei zu sein:

Forfiles /P E:\Ordner\ /S /M *.* /D -8 /C "cmd /c del /q @path"

/P E:\Ordner               : Pfad auf dem die Suche gestartet werden soll
/S                         : Bitte mit allen Unterordnern
/M *.*                     : Suchmaske - hier alle Dateien (ausser denen ohne Dateiendung)
/D -8                      : Letztes Änderungsdatum älter als 8 Tage zum heutigen Datum
/C "cmd /c del /q @path"   : Befehl der mit diesen Dateien ausgeführt werden soll (hier löschen)


Important.png
Hinweis:forfiles kann NICHT mit UNC-Pfaden umgehen (\\Server\Freigabe\)




2 Variante 2: robocopy

Per robocopy schummeln wir - wir verschieben alle älteren Dateien in eine neuen Ordner - den wir dann löschen

mkdir E:\TEMP
robocopy.exe E:\Ordner E:\TEMP /E /MOVE /MINAGE:8 /R:1 /W:1
rmdir E:\TEMP /s /q

mkdir E:\TEMP              : Verzeichnis E:\TEMP erstellen

E:\Ordner                  : Quellordner
E:\TEMP                    : Zielordner
/E                         : inklusive Unterverzeichnisse
/MOVE                      : verschieben statt kopieren
/MINAGE:8                  : Mindestalter, Dateien die jünger als 8 Tage sind werden ignoriert
/R:1                       : Bei Fehler 1x noch mal versuchen
/W:1                       : zwischen Wiederholungen 1 Sekunde warten (bei Fehler)

rmdir E:\TEMP /s /q        : Verzeichnis E:\TEMP inklusive Unterverzeichnissen ohne Nachfrage löschen



---

3 Variante 3: Nur die letzten X Dateien behalten

  • 12.02.2015: Nach Vorschlag von XYZ das Beispiel um zwei " " um das %%F ergänzt - sonst geht es nicht mit Dateinamen die Leerzeichen enthalten.

Hier einmal (in sauberer Schrift) der Vorschlag von ZAP. Dieser hat den Charme das man damit die Anzahl der Dateien die man behalten will begrenzt. Es geht zwar nach Datum, man behält aber z.B. nur die 5 neuesten Dateien.
Achtung! Das Beispiel funktioniert nur innerhalb einer Batch-Datei! wenn Ihr es von hand testen wollt so macht aus allen %%F ein %F!

M:
cd M:\Testordner
for /f "skip=5 delims=" %%F in ('dir *.* /B /O-D /A-D') do del "%%F"

M:                                   : Auf das Laufwerk M: wechseln
cd M:\Testordner                     : und in den Ordner mit den Dateien wechseln
for /f "skip=5 delims=" %%F in  ( )  : Mache mit jeder Rückgabe (delims={nichts}) aus dem Befehl in den Klammern das was hinter do steht
                                       skip=5 bedeutet das er die ersten 5 Ergebnisse überspringen soll.
'dir *.* /B /O-D /A-D'               : dir mit den Optionen
                               /B    : Nur Dateinamen ausgeben
                               /O-D  : /O bedeutet sortieren, D bedeutet nach Datum. 
                                       Das "-" vor dem D dreht die Reihenfolge um (Älteste zuerst)
                               /A-D  : Nur Dateien mit bestimmten Attributen auflisten, D steht für Verzeichnisse, 
                                       das "-" negiert das ganze so das nur Dateien angezeigt werden
do del "%%F"                           : ... führe den Befehl del aus. %%F wird durch die zurück 
                                       gegebenen Dateinamen vom dir Befehl ersetzt




4 Variante 4: AutoIt Programm

Ich hatte neulich das Problem das ich eine bestimmte datei löschen wollte wenn diese älter als 8 Tage ist ... und bin mit allen vorstehenden Mitteln gescheitert da es
1. nur eine Datei war
2. diese auf einem UNC-Pfad lag

Lösung: DeleteFilesOlderThan.exe löscht Dateien die älter als X Tage sind
Quellcode steht da auch.



5 Kommentare


Anonymer Benutzer #1

61 Monaten zuvor
Punktzahl 0++
.

Anonymer Benutzer #2

52 Monaten zuvor
Punktzahl 0++

Mein Ausputzer ist ein Einzeiler (Grundfunktion: lösche alle Files älter als 8 !Stück!):

cd gehdarein for /f "skip=8 delims=" %%F in ('dir *.dmp /B/O-D/A-D') do del %%F

(cleanup.vbs war mir zuviel "kanonen auf spatzen")

im Detail:

for /f altbekannte filebezogene Schleife wertet noch älteren dir aus

dir /B Bare-Ausgabe ohne Header,Footer;File-Eigenschaften /O-D sortiere umgekehrt nach Datum (neueste zuerst) /A-D (optional) keine Verzeichnise ausgeben

  • .dmp File-Maskierung (hier z.B. Dumpfile)

skip=8  ! die ersten (neuesten) überspringen

del %%F restlichen Schrott entfernen (doppelt %% in Batch; live tuts ein %)

ZAP

BLinz

42 Monaten zuvor
Punktzahl 0++
spätes Danke an ZAP - war gerade genau das was ich gesucht habe :-)

XYZ

32 Monaten zuvor
Punktzahl 0++

for /f "skip=5 delims=" %%F in ('dir *.* /B /O-D /A-D') do del %%F müsste auf: for /f "skip=5 delims=" %%F in ('dir *.* /B /O-D /A-D') do del "%%F"

verbessert werden. Ohne "" findet er die Datei nicht.

PMichel

36 Monaten zuvor
Punktzahl 0++
Super, danke! Das rettet mir den Tag ;-)

Kay Urbach

35 Monaten zuvor
Punktzahl 0++

Soviel zu UNC-Pfaden. pushd und popd: http://www.i…batch-files/

Funktioniert prima.

BLinz

35 Monaten zuvor
Punktzahl 0++

Naja, Schummellösung die kurzfristig die UNC-Pfade als Netzlaufwerke mapt. Hatte ich auch mal kurz auf den Plan - warum ich es dann doch nicht damit gemacht habe weis ich nicht mehr. Ich werde bei Gelegenheit mal eine Lösung mit der Variante dazu schreiben.

Bernhard

hj

23 Monaten zuvor
Punktzahl 0++

So wird Variante 2 ohne Umwege zum Einzeiler:

robocopy.exe E:\Ordner \Device\Null /MOVE /MINAGE:8 /R:1 /W:1

Das klappt (zumindest unter W2008R2) auch mit UNC-Pfaden. \Device\Null ist der Pfad für das NUL-Device (s. technet.microsoft.com/library/Cc976138).

/E kann entfallen (ist in /MOVE enthalten).

Golter

4 Monaten zuvor
Punktzahl 0++
Variante 2 als Einzeiler klappt so nicht. In dem Technet-Artikel ist zwar "\Device\Null" beschrieben, aber nur als Registry-Eintrag. M.E. ist "\Device\Null" nicht wie gewünscht als Ziel für robocopy geeignet. Es verschiebt einfach die Dateien nach C:\Device\Null, nicht aber ins Null-Device. Damit ist das kein Löschen, sondern die Dateien sind nur aus den Augen verschwunden, weil sie in der Systempartition landen. Das wird bei großen Datenmengen irgendwann Windows die Luft abdrehen...

Marc

20 Monaten zuvor
Punktzahl 0++

Kann ich dies auch benutzen, um ganze Ordner durchzugehen?

Mein Ziel ist es, alle Profilleichen im Ordner C:\Users\, welche älter als einen Tag sind zu löschen. Wie mache ich das?

BLinz

16 Monaten zuvor
Punktzahl 0++

sollte die Robocopy-Variante können, lass den Parameter /E weg.

Ist aber gefährlich nur nach dem Verzeichnisdatum zu gehen, besser wäre das Änderungsdatum der NTUSER.DAT womit das dann doch in richtiges Skript mündet

raimannflorii@gmx.de

10 Monaten zuvor
Punktzahl 0++

Hi,

ich will in for /D %%a in ("XXX\*.*") do rd /q /s /f "%%a" zusätzlich noch mit aufnehmen, dass er alles unterhalb von ("XXX\*.*")löscht, wenn es älter als 3 Tage ist. Wie bringe ich das mit rein?

for /D -3 %%a in ("XXX\*.*") do rd /q /s /f "%%a" funktioniert nicht.

Grüße

Flo

BLinz

10 Monaten zuvor
Punktzahl 0++
Hänge doch die ganzen Zeilen einfach noch einmal an die batch und ändere das CD zuvor auf den entsprechenden Pfad ab - anstatt zu versuchen alles in einer einzigen Schleife unter zubringen

raimannflorii@gmx.de

10 Monaten zuvor
Punktzahl 0++

Hallo,

kannst du mir bitte aufzeigen was du meinst. Komme hier gerade nicht weiter :-(

Grüße

Flo

Jens

8 Monaten zuvor
Punktzahl 0++
Wow, super. Danke für die guten Tipps und guten Erklärungen. Funktioniert und hilft mir weiter!

killer2012

7 Monaten zuvor
Punktzahl 0++
Variante 2 ist einfach genial

Andreas

6 Monaten zuvor
Punktzahl 0++

Varainte 1 löst unser Problem elegant - aber man sollte noch auf Dateien einschränken.

Forfiles /P D:\spool\ /S /M * /D -8 /C "cmd /c if @isdir==FALSE del /q @path"

Danke!
Kommentar hinzufügen
znilwiki freut sich über alle Kommentare. Sofern du nicht anonym bleiben möchtest, trage deinen Namen oder deine Email-Adresse ein oder melde dich an. Du kannst das Feld auch einfach leer lassen.