756 Stimmen

Batch-Datei zum Löschen von Dateien, die älter als N Tage sind

Ich suche nach einer Möglichkeit, alle Dateien, die älter als 7 Tage sind, in einer Batch-Datei zu löschen. Ich habe mich im Internet umgesehen und einige Beispiele mit Hunderten von Codezeilen gefunden, andere wiederum erforderten die Installation zusätzlicher Befehlszeilenprogramme, um die Aufgabe zu bewältigen.

Ähnliche Dinge können sein durchgeführt in BASH in nur ein paar Zeilen Code. Es sieht so aus, als ob man für Batchdateien in Windows etwas zumindest annähernd Einfaches tun könnte. Ich suche nach einer Lösung, die in einer Standard-Windows-Eingabeaufforderung funktioniert, ohne zusätzliche Dienstprogramme. Bitte auch keine PowerShell oder Cygwin.

8 Stimmen

Jeff Atwood hat diese Frage auf Serverfault beantwortet, und ich denke, sie sollte hier dokumentiert werden. serverfault.com/questions/49614/delete-files-older-than-x-days

0 Stimmen

Eine neue Methode, die auf einer .BAT-Datei basiert und nur interne CMD.EXE-Befehle verwendet, wurde hier veröffentlicht: stackoverflow.com/questions/9746778/

1 Stimmen

gehrcke.de/zeitluecken wurde zu diesem Zweck entwickelt. Es ermöglicht sogar ein ausgeklügeltes Löschschema: Zusätzlich zur Aufbewahrung der Dateien der letzten 7 Tage kann z. B. auch jeweils eine Datei für die letzten 8 Wochen, 12 Monate und 2 Jahre aufbewahrt werden.

1186voto

aku Punkte 118808

Viel Spaß!

forfiles -p "C:\what\ever" -s -m *.* -d <number of days> -c "cmd /c del @path"

Ver forfiles Dokumentation für weitere Einzelheiten.

Weitere nützliche Informationen finden Sie unter Ein A-Z Index der Windows XP Befehlszeile .

Wenn Sie nicht über forfiles auf Ihrem Rechner installiert ist, kopieren Sie es von einem beliebigen Windows Server 2003 auf Ihrem Windows XP-Rechner unter %WinDir%\system32\ . Dies ist möglich, da die EXE vollständig kompatibel zwischen Windows Server 2003 und Windows XP ist.

In späteren Versionen von Windows und Windows Server ist es standardmäßig installiert.

Für Windows 7 und neuere Versionen (einschließlich Windows 10):

Die Syntax hat sich ein wenig geändert. Daher lautet der aktualisierte Befehl:

forfiles /p "C:\what\ever" /s /m *.* /D -<number of days> /C "cmd /c del @path"

0 Stimmen

Ich habe keine forfiles auf meinem XP (sp3) Rechner - woher kommt das?

13 Stimmen

Sollte del @FILE sein, Groß- und Kleinschreibung spielt eine Rolle Ich schlage auch vor, /c echo @FILE zum Testen zu verwenden

42 Stimmen

@Russell: @PATH ist der vollständige Pfad, einschließlich des Namens. @DATEI ist nur der Name, wenn Sie also mit Unterordnern arbeiten, wird es nicht funktionieren.

86voto

Iman Punkte 845

Führen Sie Folgendes aus Befehle :

ROBOCOPY C:\source C:\destination /mov /minage:7
del C:\destination /q

Verschieben Sie alle Dateien (mit /mov, das Dateien verschiebt und dann löscht, im Gegensatz zu /move, das ganze Dateibäume verschiebt, die dann gelöscht werden) per robocopy an einen anderen Ort, und führen Sie dann einen Löschbefehl auf diesem Pfad aus, und alles ist gut.

Wenn Sie ein Verzeichnis mit vielen Daten darin haben, können Sie auch /mir Schalter

5 Stimmen

In den meisten Fällen ist dies eine ziemlich unpraktische Antwort. Wenn ich ein Verzeichnis mit vielen Daten darin habe, wird es nicht gut funktionieren. Ich würde mit einer der Antwort, die es tut "an Ort und Stelle" gehen

6 Stimmen

@adamb0mb das ist keineswegs unpraktisch - wenn "Ziel" befindet sich auf demselben Dateisystem wie "Quelle" ist der Verschiebevorgang recht einfach. Da robocopy realmente robust ist, funktioniert es in der Tat für jede Verzeichnisgröße, obskure Dateinamen, im Grunde beliebige Pfadlängen und Include-Verzeichnisse, wenn Sie es brauchen - etwas, das man von vielen anderen Windows-Dienstprogrammen sicher nicht behaupten kann. Ich würde verwenden rd /s /q c:\destination anstelle der del Befehl oder sogar einen anderen robocopy /mir c:\emptydir c:\destination ausführen, um das Verzeichnis zu leeren, wenn Sie Probleme mit Dateinamen erwarten.

13 Stimmen

Außerdem unterstützt robocopy UNC-Pfade - was forfiles der akzeptierten Antwort nicht ausreicht.

31voto

Jay Punkte 1605

Ok, mir war ein bisschen langweilig und ich habe mir das hier ausgedacht, das meine Version eines Linux-Epochen-Ersatzes für arme Leute enthält, der auf den täglichen Gebrauch beschränkt ist (keine Zeitspeicherung):

7TageReinigen.cmd

@echo off
setlocal ENABLEDELAYEDEXPANSION
set day=86400
set /a year=day*365
set /a strip=day*7
set dSource=C:\temp

call :epoch %date%
set /a slice=epoch-strip

for /f "delims=" %%f in ('dir /a-d-h-s /b /s %dSource%') do (
    call :epoch %%~tf
    if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)
)
exit /b 0

rem Args[1]: Year-Month-Day
:epoch
    setlocal ENABLEDELAYEDEXPANSION
    for /f "tokens=1,2,3 delims=-" %%d in ('echo %1') do set Years=%%d& set Months=%%e& set Days=%%f
    if "!Months:~0,1!"=="0" set Months=!Months:~1,1!
    if "!Days:~0,1!"=="0" set Days=!Days:~1,1!
    set /a Days=Days*day
    set /a _months=0
    set i=1&& for %%m in (31 28 31 30 31 30 31 31 30 31 30 31) do if !i! LSS !Months! (set /a _months=!_months! + %%m*day&& set /a i+=1)
    set /a Months=!_months!
    set /a Years=(Years-1970)*year
    set /a Epoch=Years+Months+Days
    endlocal& set Epoch=%Epoch%
    exit /b 0

ANWENDUNG

set /a strip=day*7 : Ändern Sie 7 für die Anzahl der zu bewahrenden Tage.

set dSource=C:\temp : Dies ist das Startverzeichnis, in dem nach Dateien gesucht wird.

ANMERKUNGEN

Dies ist ein nicht-destruktiver Code, der anzeigt, was passiert wäre.

Ändern:

if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)

auf etwas wie :

if !epoch! LEQ %slice% del /f %%f

damit Dateien tatsächlich gelöscht werden

Februar : ist fest auf 28 Tage programmiert. Bissextile Jahre ist eine Hölle hinzuzufügen, wirklich. Wenn jemand eine Idee hat, die nicht 10 Zeilen Code hinzufügen würde, gehen Sie vor und posten, so dass ich es zu meinem Code hinzufügen.

Epoche : Ich habe die Zeit nicht berücksichtigt, da es darum geht, Dateien zu löschen, die älter als ein bestimmtes Datum sind. Wenn ich Stunden/Minuten genommen hätte, wären Dateien von einem Tag gelöscht worden, der zur Aufbewahrung gedacht war.

BESCHRÄNKUNG

Epoche geht davon aus, dass Ihr kurzes Datumsformat JJJJ-MM-TT ist. Es müsste für andere Einstellungen oder eine Laufzeitauswertung angepasst werden (sShortTime lesen, benutzergebundene Konfiguration, richtige Feldreihenfolge in einem Filter konfigurieren und den Filter verwenden, um die richtigen Daten aus dem Argument zu extrahieren).

Habe ich schon erwähnt, dass ich die automatische Formatierung dieses Editors hasse? Sie entfernt die Leerzeilen und das Einfügen ist eine Hölle.

Ich hoffe, das hilft.

7 Stimmen

+1 für nicht-destruktiven Code, ich werde versuchen, das zu berücksichtigen, wenn ich selbst Code-Beispiele liefere.

8 Stimmen

Viel zu spät und völlig unzusammenhängend, aber 7daysclean.cmd klingt wie ein toller Name für eine Synth-Punk-Band.

25voto

Arno Jansen Punkte 231
forfiles /p "v:" /s /m *.* /d -3 /c "cmd /c del @path"

Sie sollten Folgendes tun /d -3 (3 Tage früher) Das funktioniert bei mir gut. So können alle komplizierten Chargen in den Mülleimer wandern. Auch forfiles unterstützen keine UNC-Pfade, also stellen Sie eine Netzwerkverbindung zu einem bestimmten Laufwerk her.

3 Stimmen

Der gleiche Fehler wie in anderen Antworten (einschließlich der akzeptierten). Woher kommt diese seltsame Angewohnheit der Angabe von *.* kommen? Wildcard *.* stimmt nicht mit allen Dateien in Windows überein. Es passt nur auf Dateien mit . in ihren Namen. Der OP sagte nie etwas über die Forderung nach . im Dateinamen. Der richtige Parameter ist /M * aber das ist ohnehin die Standardeinstellung. Es besteht keine Notwendigkeit für /M überhaupt nicht.

0 Stimmen

@AnT: Sind Sie sicher? Ich denke *.* verhält sich genau wie * in Windows. Tatsächlich habe ich es gerade auf meinem Computer ausprobiert, und dir *.* tatsächlich aufgeführt test file , eine Datei ohne Erweiterung.

1 Stimmen

@Andreas Rejbrand: Ich finde es auch überraschend, aber die Behandlung von *.* inkonsistent ist zwischen, sagen wir, dir y -m Option von forfiles . Die -m *.* mask überspringt in der Tat Dateinamen ohne Erweiterung, wie ich in meinem obigen Kommentar schrieb (probieren Sie es selbst aus). Das Lustige daran ist, dass die MS-Dokumentation ausdrücklich besagt, dass -m *.* ist die Standardeinstellung. Wenn Sie es jedoch im wirklichen Leben ausprobieren, werden Sie feststellen, dass die Standardeinstellung in Wirklichkeit -m * - alle Dateien werden iteriert.

17voto

e.James Punkte 112528

Werfen Sie einen Blick auf meine Antwort zu einer ähnliche Frage :

REM del_old.bat
REM usage: del_old MM-DD-YYY
for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do if exist %%~nxa echo %%~nxa >> FILES_TO_KEEP.TXT
for /f "tokens=*" %%a IN ('xcopy *.* /L /I /EXCLUDE:FILES_TO_KEEP.TXT null') do if exist "%%~nxa" del "%%~nxa"

Damit werden Dateien gelöscht, die älter als ein bestimmtes Datum sind. Ich bin sicher, dass es geändert werden kann, um sieben Tage ab dem aktuellen Datum zurückzugehen.

aktualisieren: Ich stelle fest, dass HerbCSO das obige Skript verbessert hat. Ich empfehle die Verwendung von seine Version stattdessen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X