Dateien automatisiert löschen, die älter als x-Tage/Datum sind

Wenn Sie automatisiert Dateien löschen möchten, die ein gewisses Alter erreicht haben, stellt die Batch eine kleine Hürde dar. Nicht dass es nicht möglich ist, doch der Aufwand steht in keinem Verhältnis. Schnell werden Sie versuchen, sich in VB (Skript) mit dem Problem zu beschäftigen.
Die Handhabung eines Datum bedeutet nach wie vor erheblichen Aufwand. Schön, dass es da schon etwas gibt. Ein weiteres Tool von Microsoft nämlich, welches es umsonst gibt und einem die Arbeit extrem erleichtert, ist „forfiles.exe“. Es ist kostenlos erhältlich und meines Wissens ab Windows Server 2003 auch standardmäßig in der Installation vorhanden. Auf jeden Fall ist Forfiles  im „w2k reskit“ enthalten.
-> Download forfiles.exe direkt von Microsoft

Prüfung, ob „forfiles“ vorhanden ist
Gehen Sie auf Start/Ausführen und geben Sie „cmd“ ein. In der DOS-Box geben Sie „forfiles“ ein. öffnet sich die Beschreibung von „forfiles“, ist es auf Ihrem System vorhanden.  Erscheint eine Meldung, dass Ihr Befehl falsch geschrieben sei, so müssen Sie die Datei auf Ihr System kopieren. Laden Sie sich als erstes „forfiles.exe“ aus dem Netz. Entpacken Sie die ZIP-Datei und kopieren die Datei „forfiles.exe“ am Besten in den Ordner „Windows/System32“. Dort haben Sie ständig Zugriff auf diese Datei.

Befehlssyntax:
Syntax für NT/ Windows 2000/SP:

FORFILES [-pPath] [-s] [-dDate] [-mMask] [-cCommand]

Syntax für Windows 2003/Vista/Win8 (2012):

FORFILES [/P Path] [/S] [/D Date] [/M Mask] [/C Command]

key
Path: Pfad für die Suche (default=current folder)

-s: Rekursives Suchen in Unter-Ordner

Date:  Kann sein
+DDMMYY zum Selektieren von Dateien die neuer sind als (filedate >=DDMMYY)
-DDMMYY zum Selektieren von Dateien die älter sind als (filedate <=DDMMYY)
+DD zum Selektieren von Dateien die neuer sind als „DD“-Tage
-DD zum Selektieren von Dateien die älter sind als „DD“-Tage

Mask:  Suchmaske (wildcards allowed)  default=*.*
Command: Command zum Ausführen einer Datei.  default=“CMD /C Echo @FILE“

Die folgenden Variablen können benutzt werden mit -cCommand (Großschreibung beachten)
@FILE,
@FNAME_WITHOUT_EXT,
@EXT,
@PATH,
@RELPATH,
@ISDIR,
@FSIZE,
@FDATE,
@FTIME

Beispiele:
FORFILES -pC: -s -m*.TXT -c“CMD /C Echo @FILE
Dieser Befehl listet Ihnen alle „.txt“-Files in Ihrem C-Laufwerk auf.

FORFILES -pC: -s -m*.HTML -c“CMD /C Echo @RELPATH ist der Ordner von @FILE“
Dieser Befehl zeigt Ihnen die Ordner der TXT-Dateien auf dem C-Laufwerk

FORFILES -pC: -s -m*. -c“CMD /C if @ISDIR==TRUE echo @FILE ist ein Ordner“
Zeigt alle Ordner im C-Laufwerk an

FORFILES -pc: -s -m*.* -d-100 -c“CMD /C Echo @FILE : Datum >= 100 Tage“
Zeigt alle Dateien im C-Laufwerk, die größer/gleich 100 Tage alt sind

FORFILES -pc: -s -m*.* -d-010195 -c“CMD /C Echo @FILE ist älter als 01011995!“
Zeigt alle Dateien im C-Laufwerk, älter größer/gleich als das angegebene Datum sind

Jetzt zu unserem Problem. Listen wir einmal alle Dateien im Verzeichnis „C:test“ auf, die älter als fünf Tage sind: „FORFILES -pC:test -d-5“ liefert uns das Ergebnis. Sichern wir das Skript ein wenig ab, in dem wir eine Suchmaske mit übergeben. Fügen Sie dem Befehl „-m*.rtf“ hinzu. Nun listet der Befehl nur die rtf-Dateien auf, die älter als fünf Tage sind. Wenn Sie automatisiert Daten löschen wollen und die Daten immer dem gleichen Typ entsprechen, kann dies Ihrem Skript mehr Sicherheit geben.
So, nun fügen wir den Befehl hinzu, um Daten zu löschen. Wie oben ersichtlich kann mit „-c“ ein Command mit übergeben werden. ACHTUNG: Ab jetzt löschen wir Dateien!
Fügen Sie Ihrem Befehl -c“CMD /C del @FILE“ hinzu. Zum Testen können Sie „del“ durch „echo“ ersetzen. Der vollständige Befehl lautet nun: „FORFILES -pC:test -d-5 -m*.rtf  -c“CMD /C del @FILE“

Diesen Befehl können Sie nun auch in einem Skript oder direkt automatisiert in einem Schedule-Task ausführen.

ANMERKUNG:
Je nach Version von forfiles können die Parameter anders aufgerufen werden. Evtl. heißt der Syntax: FORFILES /P D:test /D -5 /M *.rtf /C „CMD /C DEL @FILE“

UPDATE 2013:
Einige Parameter habe ich angepasst, da der Editor auch einige Backslashes verschluckt hat. Ich bitte um Entschuldigung.
Eine weitere Anwendung des FORFILES-Befehls gibt es im Artikel „Batch: Anzahl Dateien im Ordner und löschen

UPDATE 2020:

Auch unter Windows 10 funktioniert Forefiles. Nach vielen Jahren habe ich den Befehl wieder benötigt und erfolgreich ausgeführt (-d -5: Dateien, die älter als 5 Tage sind):

FORFILES -p „E:PFAD“ -m *.* -d -5 -c „cmd /c del @path“

1 Gedanke zu „Dateien automatisiert löschen, die älter als x-Tage/Datum sind“

  1. Hallo
    Nette gute Anleitungen. Jedoch bin ich auf ein Problem gestossen welches ich auch nach einiger Zeit mit Google nicht lösen konnte.
    Folgendes dürfte Bekannt sein:

    @echo off
    REM **************************************************
    REM *** Skript löscht Dateien aus einem Ordern, die älter als x Tage sind.
    REM *** http://sirmark.de/computer/dateien-automatisiert-loeschen-die-aelter-als-x-tagedatum-sind-191.html
    REM ***
    REM *** Anpassung 2013: Es wird zuerst geprüft,
    REM *** ob noch mindestens X (minFiles) Dateien vorhanden sind.
    REM *** Wenn Mindestanzahl an Dateien NICHT vorhanden sind
    REM *** (beispielsweise weil ein Sync/Upload nicht mehr funktioniert),
    REM *** löscht das Skript KEINE Daten mehr.
    REM
    REM ### VARIABLEN ###
    REM minFiles = 5 : Anzahl an Dateien, die mindestens im Verzeichnis liegen müssen
    REM sicherungsverz=C: (…) : sicherungsverz zum Ordner, der überwacht werden soll
    REM -> Lokaler sicherungsverz (cmd liegt im Verzeichnis) : sicherungsverz=%~1
    REM AlterTage: (min) Tage, wie alt die zu löschenden Dateien sein sollen
    REM Laufwerksbuchstabe: Da Forfiles keine UNC-sicherungsverze beherrscht, wird dieser Laufwerksbuchstabe gemappt
    REM countFiles : Interne Zählvariable
    REM **************************************************

    setlocal
    SET minFiles=3

    REM Forefiles kann NICHT mit UNC-sicherungsverzen umgehen
    REM Hier wird ein Laufwerksbuchstabe aus dem UNC-sicherungsverz mit NET USE gemappt
    REM und nach dem FORFILES Befehl wieder gelöscht
    SET Laufwerksbuchstabe=C:tempvmbackup
    SET AlterTage=1
    SET countFiles=0

    REM Prüfe, wieviel Dateien im Ordner vorhanden sind
    if (%sicherungsverz%)==() set sicherungsverz=%~dp0
    set first=%sicherungsverz:~0,1%
    set last=%sicherungsverz:~-1%
    if not (%first%)==(^“) set sicherungsverz=^“%sicherungsverz%
    if not (%last%)==(^“) set sicherungsverz=%sicherungsverz%“
    for /F %%i in (‚dir %sicherungsverz% /B /A-d‘) do set /A countFiles=countFiles+1

    REM Ausgabe der Daten
    echo %countFiles% Dateien in sicherungsverz – Min: %minFiles%

    REM Prüfung auf Mindestanzahl an Dateien
    if %countFiles% GTR %minFiles% (
    REM Genug Files vorhanden, lösch die Dateien

    echo Loesche …
    REM Achtung: Unterschiedliche Versionen von Forfiles -p != /P -> genaue Syntax lokal mit /? ermitteln!
    REM Test – Files nur anzeigen: forfiles -p%sicherungsverz% -d-%AlterTage% -c“CMD /C echo @FILE“

    REM UNSCHARF: Zeigt nur die Files an. Zum Löschen das folgende echo in del ändern: „CMD /C del @FILE“
    forfiles /p %Laufwerksbuchstabe% /D -%AlterTage% /c „cmd /c del @FILE“
    ) ELSE (
    echo Zuwenig Dateien zum Löschen!
    )
    endlocal

    Klappt bis auf eine entscheidende Sache 1A.
    Leider behält es mir keine Daten, wenn das Datum darüber ist.
    Mit „SET minFiles=3“
    lege ich ja fest, dass es mir mind. 3 Dateien auf keinen Umständen löschen darf?
    Wäre nice wenn wer das Problem finden kann.

    Danke & Gruss
    Patrick

    Antworten

Schreibe einen Kommentar