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

677

Ich suche nach einer Möglichkeit, alle Dateien, die älter als 7 Tage sind, in einer Batchdatei zu löschen. Ich habe im Internet gesucht und einige Beispiele mit Hunderten von Codezeilen gefunden, andere, für die zusätzliche Befehlszeilenprogramme installiert werden mussten, um die Aufgabe auszuführen.

Ähnliche Dinge können in BASH in nur wenigen Codezeilen ausgeführt werden. Es scheint, dass für Batch-Dateien in Windows zumindest aus der Ferne etwas Einfaches getan werden könnte. Ich suche nach einer Lösung, die in einer Standard-Windows-Eingabeaufforderung ohne zusätzliche Dienstprogramme funktioniert. Bitte auch keine PowerShell oder Cygwin.

Kibbee
quelle
8
Jeff Atwood hat dies auf Serverfault beantwortet, was meiner Meinung nach hier dokumentiert werden sollte. serverfault.com/questions/49614/delete-files-older-than-x-days
Dusty
Eine neue Methode, die auf einer .BAT-Datei basiert und nur interne CMD.EXE-Befehle verwendet, wurde hier veröffentlicht: stackoverflow.com/questions/9746778/…
Aacini
1
gehrcke.de/timegaps wurde für diesen Zweck entwickelt. Es ermöglicht sogar ein ausgefeilteres Löschschema: Zusätzlich zum Speichern von Dateien der letzten 7 Tage kann z. B. auch eine Datei für jede der letzten 8 Wochen, 12, Monate und 2 Jahre aufbewahrt werden.
Dr. Jan-Philip Gehrcke

Antworten:

1071

Genießen:

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

Weitere Informationen finden Sie in der forfilesDokumentation .

Weitere Extras finden Sie unter Ein AZ-Index in der Windows XP-Befehlszeile .

Wenn Sie nicht forfilesauf Ihrem Computer installiert haben , kopieren Sie es von Windows Server 2003 auf Ihren Windows XP-Computer unter %WinDir%\system32\. Dies ist möglich, da die EXE-Datei 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 höher (einschließlich Windows 10):

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

forfiles /p "C:\what\ever" /s /m *.* /D -<number of days> /C "cmd /c del @path"
aku
quelle
12
Sollte del @FILE sein, Fallangelegenheiten Auch ich schlage vor, / c echo @FILE zum Testen zu verwenden
Russell Steen
40
@Russell: @PATH ist der vollständige Pfad einschließlich des Namens. @FILE ist nur der Name. Wenn Sie also mit Unterordnern arbeiten, funktioniert dies nicht.
Gregmac
86
Beachten Sie, dass Sie -d "-10" angeben müssen, wenn Sie Dateien älter als 10 Tage haben möchten. -ve bedeutet "älter als", + ve bedeutet "neuer als". Sie können auch das Format DDMMYY oder -DDMMYY als Parameter für -d angeben.
Gregmac
42
Ich habe diese Syntax unter Win Server 2008 verwendet: forfiles / P "C: \ Mysql_backup" / S / M * .sql / D -30 / C "cmd / c del @PATH"
jman
9
Diese Antwort funktioniert, wenn "älter als 7 Tage" als "vor mehr als 7 Tagen geändert" und nicht als "vor mehr als 7 Tagen erstellt" definiert ist. Wie kann Letzteres erreicht werden?
TimS
76

Führen Sie die folgenden Befehle aus :

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

Verschieben Sie alle Dateien (mit / mov, wodurch Dateien verschoben und dann gelöscht werden, im Gegensatz zu / move, mit dem ganze Dateibäume verschoben werden, die dann gelöscht werden) per Robocopy an einen anderen Speicherort, und führen Sie dann einen Löschbefehl auf diesem Pfad aus, und Sie sind alle gut.

Auch wenn Sie ein Verzeichnis mit vielen Daten haben, können Sie /mirswitch verwenden

Iman
quelle
5
Zum größten Teil ist dies eine ziemlich unpraktische Antwort. Wenn ich ein Verzeichnis mit vielen Daten habe, wird es nicht gut funktionieren. Ich würde mit einer der Antworten gehen, die es "an Ort und Stelle" macht
adamb0mb
5
@ adamb0mb Dies ist keineswegs unpraktisch. Wenn sich "Ziel" im selben Dateisystem wie "Quelle" befindet , ist der Verschiebevorgang recht einfach. Da Robocopy sehr robust ist, funktioniert es in der Tat für jede Verzeichnisgröße, obskure Dateinamen, grundsätzlich beliebige Pfadlängen und schließt Verzeichnisse ein, wenn Sie dies benötigen - etwas, das über viele andere Windows-Dienstprogramme sicherlich nicht gesagt werden kann. Ich würde jedoch rd /s /q c:\destinationanstelle des delBefehls oder sogar einen anderen robocopy /mir c:\emptydir c:\destinationLauf verwenden, um das Verzeichnis zu leeren, wenn Sie Probleme mit Dateinamen erwarten.
Syneticon-DJ
12
Außerdem unterstützt Robocopy UNC-Pfade - was forfilesaus der akzeptierten Antwort nicht hervorgeht.
Syneticon-DJ
3
Meine Gedanken waren eher so: "Meine Dateien sind bereits dort, wo ich sie haben möchte. Ich möchte sie nicht verschieben müssen." "Das Löschen von Dateien ist logisch, was Sie tun, also tun Sie das. Überladen Sie
Robocopy
3
Ich empfehle diesen Einzeiler, um alle Dateien in mehr C:\testals 7 Tagen anzuzeigen. Um die Dateien zu löschen, ändern Sie echodelforfiles /p "C:\test" /m "*.*" /c "cmd /c echo @file" /D -7
Folgendes
25

Ok war ein bisschen gelangweilt und hat sich das ausgedacht, das meine Version des Linux-Epochenersatzes eines armen Mannes enthält, der für den täglichen Gebrauch beschränkt ist (keine Zeitaufbewahrung):

7daysclean.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

VERWENDUNGSZWECK

set /a strip=day*7: Ändern Sie 7 für die Anzahl der Tage, die aufbewahrt werden sollen.

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

ANMERKUNGEN

Dies ist zerstörungsfreier Code, der anzeigt, was passiert wäre.

Veränderung :

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

zu so etwas wie:

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

Dateien werden also tatsächlich gelöscht

Februar : ist auf 28 Tage fest codiert. Bissextile Jahre sind wirklich eine Hölle. Wenn jemand eine Idee hat, die keine 10 Codezeilen hinzufügen würde, posten Sie, damit ich sie meinem Code hinzufüge.

Epoche : Ich habe die Zeit nicht berücksichtigt, da Dateien gelöscht werden müssen, die älter als ein bestimmtes Datum sind. Wenn Sie Stunden / Minuten benötigen, werden Dateien von einem Tag gelöscht, der für die Aufbewahrung vorgesehen war.

VERJÄHRUNG

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

Habe ich erwähnt, dass ich die automatische Formatierung dieses Editors hasse? es entfernt die leeren Zeilen und das Kopieren und Einfügen ist eine Hölle.

Ich hoffe das hilft.

Jay
quelle
4
+1 für zerstörungsfreien Code, ich werde versuchen, dies zu berücksichtigen, wenn ich selbst Codebeispiele bereitstelle.
Haugholt
5
Viel spät und völlig unabhängig, 7daysclean.cmdklingt aber nach einem großartigen Namen für eine Synth-Punk-Band.
Flonk
21
forfiles /p "v:" /s /m *.* /d -3 /c "cmd /c del @path"

Das solltest du tun /d -3(3 Tage früher). Das funktioniert gut für mich. So könnten sich alle komplizierten Chargen im Papierkorb befinden. Auch forfilesunterstützt keine UNC - Pfade, so eine Netzwerkverbindung zu einem bestimmten Laufwerk machen.

Arno Jansen
quelle
3
Gleicher Fehler wie in anderen Antworten (einschließlich der akzeptierten). Woher kommt diese seltsame Angewohnheit des Spezifizierens *.*? Der Platzhalter *.*stimmt nicht mit allen Dateien in Windows überein. Es werden nur Dateien mit .ihren Namen abgeglichen. Das OP hat nie etwas darüber gesagt, was .im Dateinamen erforderlich ist . Der richtige Parameter ist /M *, aber dies ist trotzdem die Standardeinstellung. Es besteht überhaupt keine Notwendigkeit /M.
Am
@AnT: Bist du sicher? Ich denke, *.*verhält sich genau wie *in Windows. Tatsächlich habe ich es einfach auf meinem Computer versucht und dir *.*tatsächlich test fileeine Datei ohne Erweiterung aufgelistet .
Andreas Rejbrand
1
@Andreas Rejbrand: Ich finde es auch überraschend, aber die Behandlung von *.*ist inkonsistent zwischen sagen wir dirund -mOption von forfiles. Die -m *.*Maske überspringt in der Tat erweiterungslose Dateinamen, wie ich oben in meinem Kommentar angegeben habe (probieren Sie es selbst aus). Der lustige Teil hier ist, dass die MS-Dokumentation ausdrücklich angibt, dass dies -m *.*die Standardeinstellung ist. Wenn Sie es jedoch im wirklichen Leben versuchen, werden Sie feststellen, dass der Standardwert tatsächlich ist -m *- alle Dateien werden iteriert.
Am
1
Diese MS-Dokumentationsseite - technet.microsoft.com/en-us/library/cc753551(v=ws.11).aspx - enthält eine große Anzahl von Fehlern (z. B. in Beispielen), da der Autor des Dokuments fälschlicherweise glaubte, dass die *.*Maske angewendet wurde zu allen Dateien. Meine rethorische Frage nach "dieser seltsamen Angewohnheit" war in der Tat unangebracht, da die Behandlung *.*und *als Äquivalent eine langjährige Windows-Konvention ist. Die /mOption in forfilesverstößt jedoch aus irgendeinem Grund gegen diese Konvention.
Am
1
Hintergrundinformationen zu den 5 Platzhaltern in Windows: blogs.msdn.microsoft.com/jeremykuhne/2017/06/04/…
MSalters
18

Schauen Sie sich meine Antwort auf eine ähnliche Frage an :

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"

Dadurch 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ück zu gehen.

Update: Ich stelle fest, dass HerbCSO das obige Skript verbessert hat. Ich empfehle stattdessen seine Version zu verwenden.

James
quelle
12

Mein Befehl ist

forfiles -p "d:\logs" -s -m*.log -d-15 -c"cmd /c del @PATH\@FILE" 

@PATH - ist nur Pfad in meinem Fall, also musste ich verwenden @PATH\@FILE

forfiles /?funktioniert auch nicht für mich, aber forfiles(ohne "?") hat gut funktioniert.

Und die einzige Frage, die ich habe: Wie füge ich mehrere Masken hinzu (zum Beispiel " .log | .bak")?

All dies in Bezug auf forfiles.exe, das ich hier heruntergeladen habe (auf Win XP)

Wenn Sie jedoch den Windows-Server verwenden, sollte forfiles.exe bereits vorhanden sein und unterscheidet sich von der FTP-Version. Deshalb sollte ich den Befehl ändern.

Für Windows Server 2003 verwende ich diesen Befehl:

forfiles -p "d:\Backup" -s -m *.log -d -15 -c "cmd /c del @PATH"
segero
quelle
9

Es gibt sehr oft relative datums- / zeitbezogene Fragen, die mit einer Batchdatei gelöst werden müssen. Der Befehlszeileninterpreter cmd.exe hat jedoch keine Funktion für Datums- / Zeitberechnungen. Viele gute Arbeitslösungen mit zusätzlichen Konsolenanwendungen oder Skripten wurden bereits hier, auf anderen Seiten von Stack Overflow und auf anderen Websites veröffentlicht.

Für Operationen, die auf Datum / Uhrzeit basieren, ist die Anforderung üblich, eine Datums- / Zeitzeichenfolge seit einem bestimmten Tag in Sekunden umzuwandeln. Sehr häufig ist 1970-01-01 00:00:00 UTC. Jeder spätere Tag kann jedoch auch verwendet werden, abhängig vom Datumsbereich, der für die Unterstützung einer bestimmten Aufgabe erforderlich ist.

Jay hat 7daysclean.cmd gepostet, das eine schnelle "Datum zu Sekunden" -Lösung für den Befehlszeileninterpreter cmd.exe enthält . Aber es dauert nicht richtig Schaltjahre zu berücksichtigen. JR hat ein Add-On veröffentlicht, um den Schalttag im laufenden Jahr zu berücksichtigen, die anderen Schaltjahre seit dem Basisjahr, dh seit 1970, zu ignorieren.

Ich verwende seit 20 Jahren statische Tabellen (Arrays), die einmal mit einer kleinen C-Funktion erstellt wurden, um schnell die Anzahl der Tage einschließlich der Schalttage vom 01.01.1970 in Datums- / Zeitkonvertierungsfunktionen in meinen in C / C ++ geschriebenen Anwendungen zu ermitteln.

Diese sehr schnelle Tabellenmethode kann auch im Batch-Code mit dem Befehl FOR verwendet werden . Deshalb habe ich mich entschlossen, die Batch-Subroutine zu codieren, die GetSecondsdie Anzahl der Sekunden seit 1970-01-01 00:00:00 UTC für eine an diese Routine übergebene Datums- / Zeitzeichenfolge berechnet.

Hinweis: Schaltsekunden werden nicht berücksichtigt, da die Windows-Dateisysteme auch keine Schaltsekunden unterstützen.

Zunächst die Tabellen:

  1. Tage seit 1970-01-01 00:00:00 UTC für jedes Jahr einschließlich Schalttagen.

    1970 - 1979:     0   365   730  1096  1461  1826  2191  2557  2922  3287
    1980 - 1989:  3652  4018  4383  4748  5113  5479  5844  6209  6574  6940
    1990 - 1999:  7305  7670  8035  8401  8766  9131  9496  9862 10227 10592
    2000 - 2009: 10957 11323 11688 12053 12418 12784 13149 13514 13879 14245
    2010 - 2019: 14610 14975 15340 15706 16071 16436 16801 17167 17532 17897
    2020 - 2029: 18262 18628 18993 19358 19723 20089 20454 20819 21184 21550
    2030 - 2039: 21915 22280 22645 23011 23376 23741 24106 24472 24837 25202
    2040 - 2049: 25567 25933 26298 26663 27028 27394 27759 28124 28489 28855
    2050 - 2059: 29220 29585 29950 30316 30681 31046 31411 31777 32142 32507
    2060 - 2069: 32872 33238 33603 33968 34333 34699 35064 35429 35794 36160
    2070 - 2079: 36525 36890 37255 37621 37986 38351 38716 39082 39447 39812
    2080 - 2089: 40177 40543 40908 41273 41638 42004 42369 42734 43099 43465
    2090 - 2099: 43830 44195 44560 44926 45291 45656 46021 46387 46752 47117
    2100 - 2106: 47482 47847 48212 48577 48942 49308 49673
    

    Die Berechnung der Sekunden für die Jahre 2039 bis 2106 mit Beginn der Epoche 1970-01-01 ist nur mit einer vorzeichenlosen 32-Bit-Variablen möglich, dh einer vorzeichenlosen langen (oder vorzeichenlosen int) in C / C ++.

    Aber cmd.exe Verwendung für mathematische Ausdrücke unterzeichnete einen 32-Bit - Variable. Daher ist der Maximalwert 2147483647 (0x7FFFFFFF), also 2038-01-19 03:14:07.

  2. Schaltjahrinformation (Nein / Ja) für die Jahre 1970 bis 2106.

    1970 - 1989: N N Y N N N Y N N N Y N N N Y N N N Y N
    1990 - 2009: N N Y N N N Y N N N Y N N N Y N N N Y N
    2010 - 2029: N N Y N N N Y N N N Y N N N Y N N N Y N
    2030 - 2049: N N Y N N N Y N N N Y N N N Y N N N Y N
    2050 - 2069: N N Y N N N Y N N N Y N N N Y N N N Y N
    2070 - 2089: N N Y N N N Y N N N Y N N N Y N N N Y N
    2090 - 2106: N N Y N N N Y N N N N N N N Y N N
                                     ^ year 2100
    
  3. Anzahl der Tage bis zum ersten Tag eines jeden Monats im laufenden Jahr.

                       Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
    Year with 365 days:  0  31  59  90 120 151 181 212 243 273 304 334
    Year with 366 days:  0  31  60  91 121 152 182 213 244 274 305 335
    

Das Konvertieren eines Datums in eine Anzahl von Sekunden seit dem 01.01.1970 ist mit diesen Tabellen recht einfach.

Aufmerksamkeit bitte!

Das Format der Datums- und Zeitzeichenfolgen hängt von der Windows-Region und den Spracheinstellungen ab. Die Trennzeichen und die Reihenfolge der Token an die Umgebungsvariablen zugewiesen Day, Monthund Yearin erster FOR - Schleife GetSecondsmuß , wenn notwendig , um lokales Datums- / Uhrzeitformat angepasst werden.

Die Datumszeichenfolge der Umgebungsvariablen muss angepasst werden, wenn sich das Datumsformat in der Umgebungsvariablen DATE vom Datumsformat unterscheidet, das vom Befehl FOR on verwendet wird %%~tF.

Wenn zum Beispiel %DATE%erweitert wird, Sun 02/08/2015während %%~tFzu 02/08/2015 07:38 PMdem folgenden Code erweitert wird, kann Zeile 4 geändert werden, um:

call :GetSeconds "%DATE:~4% %TIME%"

Dies führt dazu, dass nur 02/08/2015das Unterprogramm übergeben wird - die Datumszeichenfolge ohne die 3 Buchstaben der Wochentagsabkürzung und das Trennzeichen.

Alternativ kann Folgendes verwendet werden, um das aktuelle Datum im richtigen Format zu übergeben:

call :GetSeconds "%DATE:~-10% %TIME%"

Jetzt werden die letzten 10 Zeichen aus der Datumszeichenfolge an function übergeben, GetSecondsund daher spielt es keine Rolle, ob die Datumszeichenfolge der Umgebungsvariablen DATE mit oder ohne Wochentag ist, solange Tag und Monat immer mit 2 Ziffern in der erwarteten Reihenfolge, dh im Format dd/mm/yyyy oder, vorliegen dd.mm.yyyy.

Hier ist der Stapelcode mit Erläuterungen zu Kommentaren, die nur die zu löschende Datei und die im C:\TempOrdnerbaum zu speichernde Datei ausgeben (siehe Code der ersten FOR- Schleife).

@echo off
setlocal EnableExtensions EnableDelayedExpansion
rem Get seconds since 1970-01-01 for current date and time.
call :GetSeconds "%DATE% %TIME%"
rem Subtract seconds for 7 days from seconds value.
set /A "LastWeek=Seconds-7*86400"

rem For each file in each subdirectory of C:\Temp get last modification date
rem (without seconds -> append second 0) and determine the number of seconds
rem since 1970-01-01 for this date/time. The file can be deleted if seconds
rem value is lower than the value calculated above.

for /F "delims=" %%F in ('dir /A-D-H-S /B /S "C:\Temp"') do (
    call :GetSeconds "%%~tF:0"
    rem if !Seconds! LSS %LastWeek% del /F "%%~fF"
    if !Seconds! LEQ %LastWeek% (
        echo Delete "%%~fF"
    ) else (
        echo Keep   "%%~fF"
    )
)
endlocal
goto :EOF


rem No validation is made for best performance. So make sure that date
rem and hour in string is in a format supported by the code below like
rem MM/DD/YYYY hh:mm:ss or M/D/YYYY h:m:s for English US date/time.

:GetSeconds

rem If there is " AM" or " PM" in time string because of using 12 hour
rem time format, remove those 2 strings and in case of " PM" remember
rem that 12 hours must be added to the hour depending on hour value.

set "DateTime=%~1"
set "Add12Hours=0"
if "%DateTime: AM=%" NEQ "%DateTime%" (
    set "DateTime=%DateTime: AM=%"
) else if "%DateTime: PM=%" NEQ "%DateTime%" (
    set "DateTime=%DateTime: PM=%"
    set "Add12Hours=1"
)

rem Get year, month, day, hour, minute and second from first parameter.

for /F "tokens=1-6 delims=,-./: " %%A in ("%DateTime%") do (
    rem For English US date MM/DD/YYYY or M/D/YYYY
    set "Day=%%B" & set "Month=%%A" & set "Year=%%C"
    rem For German date DD.MM.YYYY or English UK date DD/MM/YYYY
    rem set "Day=%%A" & set "Month=%%B" & set "Year=%%C"
    set "Hour=%%D" & set "Minute=%%E" & set "Second=%%F"
)
rem echo Date/time is: %Year%-%Month%-%Day% %Hour%:%Minute%:%Second%

rem Remove leading zeros from the date/time values or calculation could be wrong.
if "%Month:~0,1%"  EQU "0" ( if "%Month:~1%"  NEQ "" set "Month=%Month:~1%"   )
if "%Day:~0,1%"    EQU "0" ( if "%Day:~1%"    NEQ "" set "Day=%Day:~1%"       )
if "%Hour:~0,1%"   EQU "0" ( if "%Hour:~1%"   NEQ "" set "Hour=%Hour:~1%"     )
if "%Minute:~0,1%" EQU "0" ( if "%Minute:~1%" NEQ "" set "Minute=%Minute:~1%" )
if "%Second:~0,1%" EQU "0" ( if "%Second:~1%" NEQ "" set "Second=%Second:~1%" )

rem Add 12 hours for time range 01:00:00 PM to 11:59:59 PM,
rem but keep the hour as is for 12:00:00 PM to 12:59:59 PM.
if "%Add12Hours%" == "1" (
    if %Hour% LSS 12 set /A Hour+=12
)
set "DateTime="
set "Add12Hours="

rem Must use 2 arrays as more than 31 tokens are not supported
rem by command line interpreter cmd.exe respectively command FOR.
set /A "Index1=Year-1979"
set /A "Index2=Index1-30"

if %Index1% LEQ 30 (
    rem Get number of days to year for the years 1980 to 2009.
    for /F "tokens=%Index1% delims= " %%Y in ("3652 4018 4383 4748 5113 5479 5844 6209 6574 6940 7305 7670 8035 8401 8766 9131 9496 9862 10227 10592 10957 11323 11688 12053 12418 12784 13149 13514 13879 14245") do set "Days=%%Y"
    for /F "tokens=%Index1% delims= " %%L in ("Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N") do set "LeapYear=%%L"
) else (
    rem Get number of days to year for the years 2010 to 2038.
    for /F "tokens=%Index2% delims= " %%Y in ("14610 14975 15340 15706 16071 16436 16801 17167 17532 17897 18262 18628 18993 19358 19723 20089 20454 20819 21184 21550 21915 22280 22645 23011 23376 23741 24106 24472 24837") do set "Days=%%Y"
    for /F "tokens=%Index2% delims= " %%L in ("N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N N Y N N") do set "LeapYear=%%L"
)

rem Add the days to month in year.
if "%LeapYear%" == "N" (
    for /F "tokens=%Month% delims= " %%M in ("0 31 59 90 120 151 181 212 243 273 304 334") do set /A "Days+=%%M"
) else (
    for /F "tokens=%Month% delims= " %%M in ("0 31 60 91 121 152 182 213 244 274 305 335") do set /A "Days+=%%M"
)

rem Add the complete days in month of year.
set /A "Days+=Day-1"

rem Calculate the seconds which is easy now.
set /A "Seconds=Days*86400+Hour*3600+Minute*60+Second"

rem Exit this subroutine
goto :EOF

Für eine optimale Leistung ist es am besten, alle Kommentare zu entfernen, dh alle Zeilen, die mit rem nach 0-4 führenden Leerzeichen beginnen.

Die Arrays können auch kleiner gemacht werden, dh der Zeitbereich von 1980-01-01 00:00:00 bis 2038-01-19 03:14:07 wird verringert, wie dies derzeit durch den obigen Batch-Code unterstützt wird, beispielsweise bis 2015-01 -01 bis 2019-12-31, wie der folgende Code verwendet, der Dateien löscht, die älter als 7 Tage im C:\TempOrdnerbaum sind.

Ferner ist der folgende Stapelcode für das 24-Stunden-Zeitformat optimiert.

@echo off
setlocal EnableDelayedExpansion
call :GetSeconds "%DATE:~-10% %TIME%"
set /A "LastWeek=Seconds-7*86400"

for /F "delims=" %%F in ('dir /A-D-H-S /B /S "C:\Temp"') do (
    call :GetSeconds "%%~tF:0"
    if !Seconds! LSS %LastWeek% del /F "%%~fF"
)
endlocal
goto :EOF

:GetSeconds
for /F "tokens=1-6 delims=,-./: " %%A in ("%~1") do (
    set "Day=%%B" & set "Month=%%A" & set "Year=%%C"
    set "Hour=%%D" & set "Minute=%%E" & set "Second=%%F"
)
if "%Month:~0,1%"  EQU "0" ( if "%Month:~1%"  NEQ "" set "Month=%Month:~1%"   )
if "%Day:~0,1%"    EQU "0" ( if "%Day:~1%"    NEQ "" set "Day=%Day:~1%"       )
if "%Hour:~0,1%"   EQU "0" ( if "%Hour:~1%"   NEQ "" set "Hour=%Hour:~1%"     )
if "%Minute:~0,1%" EQU "0" ( if "%Minute:~1%" NEQ "" set "Minute=%Minute:~1%" )
if "%Second:~0,1%" EQU "0" ( if "%Second:~1%" NEQ "" set "Second=%Second:~1%" )
set /A "Index=Year-2014"
for /F "tokens=%Index% delims= " %%Y in ("16436 16801 17167 17532 17897") do set "Days=%%Y"
for /F "tokens=%Index% delims= " %%L in ("N Y N N N") do set "LeapYear=%%L"
if "%LeapYear%" == "N" (
    for /F "tokens=%Month% delims= " %%M in ("0 31 59 90 120 151 181 212 243 273 304 334") do set /A "Days+=%%M"
) else (
    for /F "tokens=%Month% delims= " %%M in ("0 31 60 91 121 152 182 213 244 274 305 335") do set /A "Days+=%%M"
)
set /A "Days+=Day-1"
set /A "Seconds=Days*86400+Hour*3600+Minute*60+Second"
goto :EOF

Weitere Informationen zu Datums- und Zeitformaten und Dateizeitvergleichen unter Windows finden Sie in meiner Antwort unter Finden Sie heraus, ob die Datei in einer Batchdatei älter als 4 Stunden ist, mit vielen zusätzlichen Informationen zu den Dateizeiten.

Mofi
quelle
9

Kopieren Sie diesen Code und speichern Sie ihn unter DelOldFiles.vbs.

NUTZUNG IN CMD: cscript //nologo DelOldFiles.vbs 15

15 bedeutet, Dateien zu löschen, die älter als 15 Tage sind.

  'copy from here
    Function DeleteOlderFiles(whichfolder)
       Dim fso, f, f1, fc, n, ThresholdDate
       Set fso = CreateObject("Scripting.FileSystemObject")
       Set f = fso.GetFolder(whichfolder)
       Set fc = f.Files
       Set objArgs = WScript.Arguments
       n = 0
       If objArgs.Count=0 Then
           howmuchdaysinpast = 0
       Else
           howmuchdaysinpast = -objArgs(0)
       End If
       ThresholdDate = DateAdd("d", howmuchdaysinpast, Date)   
       For Each f1 in fc
     If f1.DateLastModified<ThresholdDate Then
        Wscript.StdOut.WriteLine f1
        f1.Delete
        n = n + 1    
     End If
       Next
       Wscript.StdOut.WriteLine "Deleted " & n & " file(s)."
    End Function

    If Not WScript.FullName = WScript.Path & "\cscript.exe" Then
      WScript.Echo "USAGE ONLY IN COMMAND PROMPT: cscript DelOldFiles.vbs 15" & vbCrLf & "15 means to delete files older than 15 days in past."
      WScript.Quit 0   
    End If

    DeleteOlderFiles(".")
 'to here
Paris
quelle
8

Für Windows Server 2008 R2:

forfiles /P c:\sql_backups\ /S /M *.sql /D -90 /C "cmd /c del @PATH"

Dadurch werden alle SQL- Dateien gelöscht , die älter als 90 Tage sind.

NotJustClarkKent
quelle
7

Verwenden Sie Forfiles.

Es gibt verschiedene Versionen. Frühe verwenden Unix-Stilparameter.

Meine Version (für Server 2000 - nach den Schaltern kein Leerzeichen beachten) -

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

Um Forfiles zu XP hinzuzufügen, rufen Sie die Exe von ftp://ftp.microsoft.com/ResKit/y2kfix/x86/ ab.

und fügen Sie es zu C: \ WINDOWS \ system32 hinzu

Aidan Ewen
quelle
11
@ Kibbee es ist nicht die gleiche Antwort, die Syntax ist unterschiedlich. Dies war ein echter Versuch zu helfen. Ich kannte die Windows-Befehlszeile nur sehr wenig und war stundenlang frustriert, damit dies funktioniert. Die wichtigsten Informationen für mich waren die Tatsache, dass es verschiedene Versionen (mit unterschiedlicher Syntax) gibt und dass ich die Leerzeichen entfernen musste. Keines dieser Dinge war in der ursprünglichen Antwort enthalten. (Ich hätte die Antwort kommentiert, aber ich habe nicht die Privilegien
Aidan Ewen
Gleicher Fehler wie in anderen Antworten (einschließlich der akzeptierten). Der Platzhalter *.*in forfilesstimmt nicht mit allen Dateien überein . Es werden nur Dateien mit .ihren Namen abgeglichen (dh Dateien mit Erweiterungen). Das OP hat nie etwas darüber gesagt, was .im Dateinamen erforderlich ist . Der richtige Parameter ist /M *, aber dies ist trotzdem die Standardeinstellung. Es besteht überhaupt keine Notwendigkeit /M.
Am
7

Für Windows 2012 R2 würde Folgendes funktionieren:

    forfiles /p "c:\FOLDERpath" /d -30 /c "cmd /c del @path"

Verwenden Sie diese Option, um die zu löschenden Dateien anzuzeigen

    forfiles /p "c:\FOLDERpath" /d -30 /c "cmd /c echo @path @fdate"
Viktor Ka
quelle
Dies funktioniert sogar in Windows Server 2008 und höher und Windows 7.
Kwrl
6

IMO, JavaScript wird allmählich zu einem universellen Skriptstandard: Es ist wahrscheinlich in mehr Produkten als in jeder anderen Skriptsprache verfügbar (unter Windows ist es über den Windows Scripting Host verfügbar). Ich muss alte Dateien in vielen Ordnern bereinigen, daher gibt es hier eine JavaScript-Funktion, um dies zu tun:

// run from an administrator command prompt (or from task scheduler with full rights):  wscript jscript.js
// debug with:   wscript /d /x jscript.js

var fs = WScript.CreateObject("Scripting.FileSystemObject");

clearFolder('C:\\temp\\cleanup');

function clearFolder(folderPath)
{
    // calculate date 3 days ago
    var dateNow = new Date();
    var dateTest = new Date();
    dateTest.setDate(dateNow.getDate() - 3);

    var folder = fs.GetFolder(folderPath);
    var files = folder.Files;

    for( var it = new Enumerator(files); !it.atEnd(); it.moveNext() )
    {
        var file = it.item();

        if( file.DateLastModified < dateTest)
        {
            var filename = file.name;
            var ext = filename.split('.').pop().toLowerCase();

            if (ext != 'exe' && ext != 'dll')
            {
                file.Delete(true);
            }
        }
    }

    var subfolders = new Enumerator(folder.SubFolders);
    for (; !subfolders.atEnd(); subfolders.moveNext())
    {
        clearFolder(subfolders.item().Path);
    }
}

Fügen Sie zum Löschen jedes Ordners einfach einen weiteren Aufruf der Funktion clearFolder () hinzu. Dieser spezielle Code bewahrt auch Exe- und DLL-Dateien und bereinigt auch Unterordner.

Graham Laight
quelle
6

Wie wäre es mit dieser Änderung auf 7daysclean.cmd , um ein Schaltjahr zu berücksichtigen?

Dies kann in weniger als 10 Codierungszeilen erfolgen!

set /a Leap=0
if (Month GEQ 2 and ((Years%4 EQL 0 and Years%100 NEQ 0) or Years%400 EQL 0)) set /a Leap=day
set /a Months=!_months!+Leap

Bearbeiten von Mofi:

Die oben von JR bereitgestellte Bedingung wird aufgrund ungültiger Syntax immer als falsch ausgewertet .

Und Month GEQ 2ist auch falsch, weil das Hinzufügen von 86400 Sekunden für einen weiteren Tag in einem Schaltjahr nur für die Monate März bis Dezember erfolgen muss, nicht jedoch für Februar.

Ein Arbeitscode , der den Schalttag berücksichtigt - nur im laufenden Jahr - in der von Jay geposteten Batch-Datei 7daysclean.cmd wäre:

set "LeapDaySecs=0"
if %Month% LEQ 2 goto CalcMonths
set /a "LeapRule=Years%%4"
if %LeapRule% NEQ 0 goto CalcMonths
rem The other 2 rules can be ignored up to year 2100.
set /A "LeapDaySecs=day"
:CalcMonths
set /a Months=!_months!+LeapDaySecs
JR
quelle
5

Darf ich diesem bereits wertvollen Thread einen bescheidenen Beitrag hinzufügen? Ich stelle fest, dass andere Lösungen möglicherweise den eigentlichen Fehlertext entfernen, aber% ERRORLEVEL% ignorieren, was auf einen Fehler in meiner Anwendung hinweist. UND ich möchte zu Recht% ERRORLEVEL%, solange es nicht der Fehler "Keine Dateien gefunden" ist.

Einige Beispiele:

Fehlerbehebung und Fehlerbehebung speziell:

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&ECHO found error||echo found success

Verwenden eines Oneliner, um ERRORLEVEL Erfolg oder Misserfolg zurückzugeben:

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&EXIT /B 1||EXIT /B 0

Verwenden eines Oneliners, um das ERRORLEVEL für den Erfolg im Kontext einer Batchdatei inmitten eines anderen Codes auf Null zu halten (ver> nul setzt das ERRORLEVEL zurück):

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&ECHO found error||ver > nul

Für einen SQL Server Agent CmdExec-Jobschritt bin ich auf Folgendes gestoßen. Ich weiß nicht, ob es sich um einen Fehler handelt, aber die CmdExec innerhalb des Schritts erkennt nur die erste Codezeile:

cmd /e:on /c "forfiles /p "C:\SQLADMIN\MAINTREPORTS\SQL2" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&EXIT 1||EXIT 0"&exit %errorlevel%
Stachel
quelle
5

Meine Güte, schon viele Antworten. Eine einfache und bequeme Route, die ich gefunden habe, bestand darin, ROBOCOPY.EXE zweimal in aufeinanderfolgender Reihenfolge über eine einzelne Windows-Befehlszeilenanweisung mit dem Parameter & auszuführen .

ROBOCOPY.EXE SOURCE-DIR TARGET-DIR *.* /MOV /MINAGE:30 & ROBOCOPY.EXE SOURCE-DIR TARGET-DIR *.* /MOV /MINAGE:30 /PURGE

In diesem Beispiel werden alle Dateien ( . ) Ausgewählt, die älter als 30 Tage sind, und in den Zielordner verschoben. Der zweite Befehl führt dasselbe erneut aus, indem der Befehl PURGE hinzugefügt wird. Dies bedeutet, dass Dateien im Zielordner entfernt werden, die nicht im Quellordner vorhanden sind. Im Wesentlichen verschiebt der erste Befehl Dateien und der zweite DELETES, da sie beim Aufrufen des zweiten Befehls nicht mehr im Quellordner vorhanden sind.

Konsultieren Sie die Dokumentation von ROBOCOPY und verwenden Sie beim Testen den Schalter / L.

GBGOLC
quelle
4

Wenn Sie über das XP-Ressourcen-Kit verfügen, können Sie mithilfe von Robocopy alle alten Verzeichnisse in ein einziges Verzeichnis verschieben und dann mit nur rmdir nur dieses löschen:

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

Ich denke, die Antwort von e.James ist gut, da es bereits unter Windows 2000 SP4 (und möglicherweise früher) mit unveränderten Windows-Versionen funktioniert, aber das Schreiben in eine externe Datei erforderlich ist. Hier ist eine modifizierte Version, die unter Beibehaltung der Kompatibilität keine externe Textdatei erstellt:

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, befindet sich hier ein Skript, das ALLE Berechnungen für Sie ausführt, 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 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 Mathematik geht nur in eine Richtung. Zukünftige Daten können nicht korrekt aus negativen Eingaben abgerufen werden (es wird versucht, aber wahrscheinlich über den letzten Tag des Monats hinausgehen).

Lectrode
quelle
3

Möglicherweise können Sie dies durchziehen. Sie können sich diese Frage für ein einfacheres Beispiel ansehen . Die Komplexität entsteht, wenn Sie mit dem Vergleichen der Daten beginnen. Es mag leicht zu erkennen sein, ob das Datum größer ist oder nicht, aber es sind viele Situationen zu berücksichtigen, wenn Sie tatsächlich die Differenz zwischen zwei Daten ermitteln müssen.

Mit anderen Worten - versuchen Sie nicht, dies zu erfinden, es sei denn, Sie können die Tools von Drittanbietern wirklich nicht verwenden.

Paulius
quelle
3

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

Batch-Datei, DelFilesOlderThanNDays.bat unten mit Beispiel Exec mit Parametern:

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
Goran B.
quelle
3

Ich erwähne die Antwort von Aku und sehe viele Leute, die nach UNC-Pfaden fragen. Durch einfaches Zuordnen des unc-Pfads zu einem Laufwerksbuchstaben werden Forfiles glücklich. Das Zuordnen und Aufheben der Zuordnung von Laufwerken kann beispielsweise programmgesteuert in einer Batchdatei 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 möchten, dass Z: vor der Verwendung keinem anderen Element zugeordnet ist, können Sie Folgendes tun:

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!"
)
Tobias Järvelöv
quelle
3

ROBOCOPY funktioniert hervorragend für mich. Ursprünglich mein Iman vorgeschlagen. 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 !!!

Dies sind einige Zeilen meiner Backup-Batch-Datei, zum 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 ziemlich lang werden kann und ich sie für andere Orte wiederverwenden kann. Sie müssen nur den Dos-Pfad zu Ihrem Papierkorb finden, der Ihrem Login zugeordnet ist.

Dies ist auf einem Arbeitscomputer für mich und es funktioniert. Ich verstehe, dass einige von Ihnen möglicherweise restriktivere Rechte haben, es aber trotzdem versuchen;) Durchsuchen Sie Google nach Erklärungen zu den ROBOCOPY-Parametern.

Prost!

Shawn Pauliszyn
quelle
1
Die bisher am zweithäufigsten bewertete Antwort spricht sich auch für RoboCopy aus. Zugegeben, Sie verwenden etwas andere Optionen, aber es kommt der vorhandenen Antwort nahe.
Jonathan Leffler
2
Dieser Beitrag hat einen neuen Inhalt - das Verschieben von Dateien in den Papierkorb. Dies wurde mit Robocopy noch nicht vorgeschlagen und beantwortet den ursprünglichen Beitrag vollständig mit einem integrierten einzeiligen Befehl. Funktioniert besser als das Kombinieren der Befehle 'DEL' und 'RMDIR', da die Dateien aus dem Papierkorb wiederhergestellt werden können. Hey, ich bin noch neu hier - gib mir eine Pause;)
Shawn Pauliszyn
2

Mein Skript zum Löschen von Dateien, die älter als ein bestimmtes Jahr sind:

@REM _______ GENERATE A CMD TO DELETE FILES OLDER THAN A GIVEN YEAR
@REM _______ (given in _olderthanyear variable)
@REM _______ (you must LOCALIZE the script depending on the dir cmd console output)
@REM _______ (we assume here the following line's format "11/06/2017  15:04            58 389 SpeechToText.zip")

@set _targetdir=c:\temp
@set _olderthanyear=2017

@set _outfile1="%temp%\deleteoldfiles.1.tmp.txt"
@set _outfile2="%temp%\deleteoldfiles.2.tmp.txt"

  @if not exist "%_targetdir%" (call :process_error 1 DIR_NOT_FOUND "%_targetdir%") & (goto :end)

:main
  @dir /a-d-h-s /s /b %_targetdir%\*>%_outfile1%
  @for /F "tokens=*" %%F in ('type %_outfile1%') do @call :process_file_path "%%F" %_outfile2%
  @goto :end

:end
  @rem ___ cleanup and exit
  @if exist %_outfile1% del %_outfile1%
  @if exist %_outfile2% del %_outfile2%
  @goto :eof

:process_file_path %1 %2
  @rem ___ get date info of the %1 file path
  @dir %1 | find "/" | find ":" > %2
  @for /F "tokens=*" %%L in ('type %2') do @call :process_line "%%L" %1
  @goto :eof

:process_line %1 %2
  @rem ___ generate a del command for each file older than %_olderthanyear%
  @set _var=%1
  @rem  LOCALIZE HERE (char-offset,string-length)
  @set _fileyear=%_var:~0,4%
  @set _fileyear=%_var:~7,4%
  @set _filepath=%2
  @if %_fileyear% LSS %_olderthanyear% echo @REM %_fileyear%
  @if %_fileyear% LSS %_olderthanyear% echo @del %_filepath%
  @goto :eof

:process_error %1 %2
  @echo RC=%1 MSG=%2 %3
  @goto :eof
efdummy
quelle
1

Dieser hat es für mich getan. Es funktioniert mit einem Datum und Sie können den gewünschten Betrag in Jahren abziehen, um in der Zeit zurück zu gehen:

@echo off

set m=%date:~-7,2%
set /A m
set dateYear=%date:~-4,4%
set /A dateYear -= 2
set DATE_DIR=%date:~-10,2%.%m%.%dateYear% 

forfiles /p "C:\your\path\here\" /s /m *.* /d -%DATE_DIR% /c "cmd /c del @path /F"

pause

die /Fin den cmd /c del @path /FKräften der bestimmte Datei in einigen Fällen gelöscht werden kann die Datei nur gelesen werden.

Das dateYearist die Jahresvariable und dort können Sie den Subtrakt nach Ihren eigenen Bedürfnissen ändern

Snickbrack
quelle