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.

4voto

Lectrode Punkte 382

Ich glaube e.James' Antwort ist gut, da es mit unveränderten Versionen von Windows ab Windows 2000 SP4 (und möglicherweise früher) funktioniert, aber es erfordert das Schreiben in eine externe Datei. Hier ist eine geänderte Version, die keine externe Textdatei erstellt und gleichzeitig die Kompatibilität beibehält:

REM del_old.cmd
REM usage: del_old MM-DD-YYYY
setlocal enabledelayedexpansion
for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do @if exist "%%~nxa" set "excludefiles=!excludefiles!;;%%~nxa;;"
for /f "tokens=*" %%a IN ('dir /b') do @(@echo "%excludefiles%"|FINDSTR /C:";;%%a;;">nul || if exist "%%~nxa" DEL /F /Q "%%a">nul 2>&1)

Um der ursprünglichen Frage gerecht zu werden, finden Sie hier ein Skript, das ALLE Berechnungen für Sie erledigt, wenn Sie es mit der Anzahl der Tage als Parameter aufrufen:

REM del_old_compute.cmd
REM usage: del_old_compute N
setlocal enabledelayedexpansion
set /a days=%1&set cur_y=%DATE:~10,4%&set cur_m=%DATE:~4,2%&set cur_d=%DATE:~7,2%
for /f "tokens=1 delims==" %%a in ('set cur_') do if "!%%a:~0,1!"=="0" set /a %%a=!%%a:~1,1!+0
set mo_2=28&set /a leapyear=cur_y*10/4
if %leapyear:~-1% equ 0 set mo_2=29
set mo_1=31&set mo_3=31&set mo_4=30&set mo_5=31
set mo_6=30&set mo_7=31&set mo_8=31&set mo_9=30
set mo_10=31&set mo_11=30&set mo_12=31
set /a past_y=(days/365)
set /a monthdays=days-((past_y*365)+((past_y/4)*1))&&set /a past_y=cur_y-past_y&set months=0
:setmonth
set /a minusmonth=(cur_m-1)-months
if %minusmonth% leq 0 set /a minusmonth+=12
set /a checkdays=(mo_%minusmonth%)
if %monthdays% geq %checkdays% set /a months+=1&set /a monthdays-=checkdays&goto :setmonth
set /a past_m=cur_m-months
set /a lastmonth=cur_m-1
if %lastmonth% leq 0 set /a lastmonth+=12
set /a lastmonth=mo_%lastmonth%
set /a past_d=cur_d-monthdays&set adddays=::
if %past_d% leq 0 (set /a past_m-=1&set adddays=)
if %past_m% leq 0 (set /a past_m+=12&set /a past_y-=1)
set mo_2=28&set /a leapyear=past_y*10/4
if %leapyear:~-1% equ 0 set mo_2=29
%adddays%set /a past_d+=mo_%past_m%
set d=%past_m%-%past_d%-%past_y%
for /f "tokens=*" %%a IN ('xcopy *.* /d:%d% /L /I null') do @if exist "%%~nxa" set "excludefiles=!excludefiles!;;%%~nxa;;"
for /f "tokens=*" %%a IN ('dir /b') do @(@echo "%excludefiles%"|FINDSTR /C:";;%%a;;">nul || if exist "%%~nxa" DEL /F /Q "%%a">nul 2>&1)

HINWEIS: Der obige Code berücksichtigt die Schaltjahre sowie die genaue Anzahl der Tage in jedem Monat. Das einzige Maximum ist die Gesamtzahl der Tage seit 0/0/0 (danach werden negative Jahre zurückgegeben).

HINWEIS: Die Berechnung geht nur in eine Richtung; sie kann zukünftige Daten nicht korrekt aus negativen Eingaben ermitteln (sie versucht es zwar, geht aber wahrscheinlich über den letzten Tag des Monats hinaus).

4voto

Tobias Järvelöv Punkte 137

Um die Antwort von aku zu erweitern: Ich sehe, dass viele Leute nach UNC-Pfaden fragen. Wenn Sie den UNC-Pfad einfach einem Laufwerksbuchstaben zuordnen, ist forfiles zufrieden. Das Zuordnen und Aufheben der Zuordnung von Laufwerken kann z. B. programmatisch in einer Batch-Datei erfolgen.

net use Z: /delete
net use Z: \\unc\path\to\my\folder
forfiles /p Z: /s /m *.gz /D -7 /C "cmd /c del @path"

Dadurch werden alle Dateien mit der Erweiterung .gz gelöscht, die älter als 7 Tage sind. Wenn Sie sicherstellen wollen, dass Z: nicht auf etwas anderes abgebildet ist, bevor Sie es verwenden, können Sie etwas Einfaches tun wie

net use Z: \\unc\path\to\my\folder
if %errorlevel% equ 0 (
    forfiles /p Z: /s /m *.gz /D -7 /C "cmd /c del @path"
) else (
    echo "Z: is already in use, please use another drive letter!"
)

4voto

neuracnu Punkte 119

Wenn Sie das XP-Ressourcen-Kit haben, können Sie robocopy verwenden, um alle alten Verzeichnisse in ein einziges Verzeichnis zu verschieben, und dann rmdir verwenden, um nur dieses eine zu löschen:

mkdir c:\temp\OldDirectoriesGoHere
robocopy c:\logs\SoManyDirectoriesToDelete\ c:\temp\OldDirectoriesGoHere\ /move /minage:7
rmdir /s /q c:\temp\OldDirectoriesGoHere

4voto

Shawn Pauliszyn Punkte 139

ROBOCOPY funktioniert bei mir hervorragend. Ursprünglich schlug mein Iman vor. Aber anstatt die Dateien/Ordner in ein temporäres Verzeichnis zu verschieben und dann den Inhalt des temporären Ordners zu löschen, verschieben sie die dateien in den papierkorb!!!

Hier ein paar Zeilen aus meiner Backup-Batch-Datei als Beispiel:

SET FilesToClean1=C:\Users\pauls12\Temp
SET FilesToClean2=C:\Users\pauls12\Desktop\1616 - Champlain\Engineering\CAD\Backups

SET RecycleBin=C:\$Recycle.Bin\S-1-5-21-1480896384-1411656790-2242726676-748474

robocopy "%FilesToClean1%" "%RecycleBin%" /mov /MINLAD:15 /XA:SH /NC /NDL /NJH /NS /NP /NJS
robocopy "%FilesToClean2%" "%RecycleBin%" /mov /MINLAD:30 /XA:SH /NC /NDL /NJH /NS /NP /NJS

Es löscht alles, was älter als 15 Tage ist, aus meinem "Temp"-Ordner und 30 Tage für alles in meinem AutoCAD-Sicherungsordner. Ich verwende Variablen, weil die Zeile recht lang werden kann und ich sie für andere Speicherorte wiederverwenden kann. Sie müssen nur den Dos-Pfad zu Ihrem Papierkorb finden, der mit Ihrem Login verbunden ist.

Dies ist ein Arbeitscomputer von mir und es funktioniert. Ich verstehe, dass einige von Ihnen vielleicht restriktivere Rechte haben, aber versuchen Sie es trotzdem;) Suchen Sie bei Google nach Erklärungen zu den ROBOCOPY-Parametern.

Zum Wohl!

1 Stimmen

Die bestehenden zweitmeist gewählte Antwort befürwortet ebenfalls RoboCopy. Zugegeben, Sie verwenden etwas andere Optionen, aber es ist nahe an der bestehenden Antwort.

2 Stimmen

Dieser Beitrag hat einen neuen Inhalt - das Verschieben von Dateien in den Papierkorb. Dies wurde bisher noch nicht von Robocopy vorgeschlagen und beantwortet den ursprünglichen Beitrag vollständig mit einem eingebauten einzeiligen Befehl. Es funktioniert besser als die Kombination der Befehle "DEL" und "RMDIR", da die Dateien aus dem Papierkorb wiederhergestellt werden können. Hey, ich bin noch neu hier - gönn mir eine Pause;)

3voto

Goran B. Punkte 534

Das ist nichts Erstaunliches, aber ich musste heute etwas Ähnliches tun und es als geplante Aufgabe ausführen usw.

Stapelverarbeitungsdatei DelFilesOlderThanNDays.bat mit Beispielen für Ausführung und Parameter:

DelFilesOlderThanNDays.bat 7 C:\dir1\dir2\dir3\logs *.log

echo off
cls
Echo(
SET keepDD=%1
SET logPath=%2 :: example C:\dir1\dir2\dir3\logs
SET logFileExt=%3
SET check=0
IF [%3] EQU [] SET logFileExt=*.log & echo: file extention not specified (default set to "*.log")
IF [%2] EQU [] echo: file directory no specified (a required parameter), exiting! & EXIT /B 
IF [%1] EQU [] echo: number of days not specified? :)
echo(
echo: in path [ %logPath% ]
echo: finding all files like [ %logFileExt% ]
echo: older than [ %keepDD% ] days
echo(
::
::
:: LOG
echo:  >> c:\trimLogFiles\logBat\log.txt
echo: executed on %DATE% %TIME% >> c:\trimLogFiles\logBat\log.txt
echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt
echo: in path [ %logPath% ] >> c:\trimLogFiles\logBat\log.txt
echo: finding all files like [ %logFileExt% ] >> c:\trimLogFiles\logBat\log.txt
echo: older than [ %keepDD% ] days >> c:\trimLogFiles\logBat\log.txt
echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt
::
FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c echo @path" >> c:\trimLogFiles\logBat\log.txt 2<&1
IF %ERRORLEVEL% EQU 0 (
 FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c echo @path"
)
::
::
:: LOG
IF %ERRORLEVEL% EQU 0 (
 echo:  >> c:\trimLogFiles\logBat\log.txt
 echo: deleting files ... >> c:\trimLogFiles\logBat\log.txt
 echo:  >> c:\trimLogFiles\logBat\log.txt
 SET check=1
)
::
::
IF %check% EQU 1 (
 FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c del @path"
)
::
:: RETURN & LOG
::
IF %ERRORLEVEL% EQU 0 echo: deletion successfull! & echo: deletion successfull! >> c:\trimLogFiles\logBat\log.txt
echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt

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