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

Aus Znilwiki
Wechseln zu: Navigation, Suche

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\)




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



---

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




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.



Kommentare

Kommentare


193.171.252.134

1601 Tage zuvor
Punkte 0+-
.

193.171.152.33

1329 Tage zuvor
Punkte 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

1047 Tage zuvor
Punkte 0+-
spätes Danke an ZAP - war gerade genau das was ich gesucht habe :-)

XYZ

747 Tage zuvor
Punkte 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

852 Tage zuvor
Punkte 0+-
Super, danke! Das rettet mir den Tag ;-)

Kay Urbach

823 Tage zuvor
Punkte 0+-

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

Funktioniert prima.

BLinz

823 Tage zuvor
Punkte 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

482 Tage zuvor
Punkte 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).

Marc

384 Tage zuvor
Punkte 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

273 Tage zuvor
Punkte 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

95 Tage zuvor
Punkte 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

93 Tage zuvor
Punkte 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

92 Tage zuvor
Punkte 0+-

Hallo,

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

Grüße

Flo

Jens

8 Tage zuvor
Punkte 0+-
Wow, super. Danke für die guten Tipps und guten Erklärungen. Funktioniert und hilft mir weiter!
Kommentar hinzufügen:
Gebe hier einen Kommentar ein. Du kannst einen beliebigen Namen oder eine Email-Adresse als Namen angeben.

Wenn du dich einloggst wird automatisch dein Benutzername genommen.
Du kannst KEINE Links hier posten - das wurde wegen anhaltender Werbung deaktiviert. Sobald ein '''http://''' im Text vorkommt wird der Kommentar verworfen Alle anderen Steuerzeichen oder Funktionen wie < br > werden ausgefiltert - zum Posten von Quelltexten ist diese Funktion hier nicht geeignet.

Falls du dringendere Fragen hast kannst du auch das Support-System von znil.net nutzen unter support.znil.net