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.
Antworten:
Genießen:
Weitere Informationen finden Sie in der
forfiles
Dokumentation .Weitere Extras finden Sie unter Ein AZ-Index in der Windows XP-Befehlszeile .
Wenn Sie nicht
forfiles
auf 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:
quelle
Führen Sie die folgenden Befehle aus :
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
/mir
switch verwendenquelle
rd /s /q c:\destination
anstelle desdel
Befehls oder sogar einen anderenrobocopy /mir c:\emptydir c:\destination
Lauf verwenden, um das Verzeichnis zu leeren, wenn Sie Probleme mit Dateinamen erwarten.forfiles
aus der akzeptierten Antwort nicht hervorgeht.C:\test
als 7 Tagen anzuzeigen. Um die Dateien zu löschen, ändern Sieecho
del
forfiles /p "C:\test" /m "*.*" /c "cmd /c echo @file" /D -7
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
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 :
zu so etwas wie:
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.
quelle
7daysclean.cmd
klingt aber nach einem großartigen Namen für eine Synth-Punk-Band.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. Auchforfiles
unterstützt keine UNC - Pfade, so eine Netzwerkverbindung zu einem bestimmten Laufwerk machen.quelle
*.*
? 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
.*.*
verhält sich genau wie*
in Windows. Tatsächlich habe ich es einfach auf meinem Computer versucht unddir *.*
tatsächlichtest file
eine Datei ohne Erweiterung aufgelistet .*.*
ist inkonsistent zwischen sagen wirdir
und-m
Option vonforfiles
. 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.*.*
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/m
Option inforfiles
verstößt jedoch aus irgendeinem Grund gegen diese Konvention.Schauen Sie sich meine Antwort auf eine ähnliche Frage an :
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.
quelle
Mein Befehl ist
@PATH
- ist nur Pfad in meinem Fall, also musste ich verwenden@PATH\@FILE
forfiles /?
funktioniert auch nicht für mich, aberforfiles
(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:
quelle
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
GetSeconds
die 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:
Tage seit 1970-01-01 00:00:00 UTC für jedes Jahr einschließlich Schalttagen.
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.
Schaltjahrinformation (Nein / Ja) für die Jahre 1970 bis 2106.
Anzahl der Tage bis zum ersten Tag eines jeden Monats im laufenden Jahr.
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
,Month
undYear
in erster FOR - SchleifeGetSeconds
muß , 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/2015
während%%~tF
zu02/08/2015 07:38 PM
dem folgenden Code erweitert wird, kann Zeile 4 geändert werden, um:Dies führt dazu, dass nur
02/08/2015
das 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:
Jetzt werden die letzten 10 Zeichen aus der Datumszeichenfolge an function übergeben,
GetSeconds
und 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 Formatdd/mm/yyyy
oder, vorliegendd.mm.yyyy
.Hier ist der Stapelcode mit Erläuterungen zu Kommentaren, die nur die zu löschende Datei und die im
C:\Temp
Ordnerbaum zu speichernde Datei ausgeben (siehe Code der ersten FOR- Schleife).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:\Temp
Ordnerbaum sind.Ferner ist der folgende Stapelcode für das 24-Stunden-Zeitformat optimiert.
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.
quelle
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.
quelle
Für Windows Server 2008 R2:
Dadurch werden alle SQL- Dateien gelöscht , die älter als 90 Tage sind.
quelle
Verwenden Sie Forfiles.
Es gibt verschiedene Versionen. Frühe verwenden Unix-Stilparameter.
Meine Version (für Server 2000 - nach den Schaltern kein Leerzeichen beachten) -
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
quelle
*.*
inforfiles
stimmt 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
.Für Windows 2012 R2 würde Folgendes funktionieren:
Verwenden Sie diese Option, um die zu löschenden Dateien anzuzeigen
quelle
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:
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.
quelle
Wie wäre es mit dieser Änderung auf 7daysclean.cmd , um ein Schaltjahr zu berücksichtigen?
Dies kann in weniger als 10 Codierungszeilen erfolgen!
Bearbeiten von Mofi:
Die oben von JR bereitgestellte Bedingung wird aufgrund ungültiger Syntax immer als falsch ausgewertet .
Und
Month GEQ 2
ist 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:
quelle
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:
Verwenden eines Oneliner, um ERRORLEVEL Erfolg oder Misserfolg zurückzugeben:
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):
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:
quelle
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 .
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.
quelle
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:
quelle
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:
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:
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).
quelle
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.
quelle
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:
quelle
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.
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:
quelle
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:
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!
quelle
Mein Skript zum Löschen von Dateien, die älter als ein bestimmtes Jahr sind:
quelle
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:
die
/F
in dencmd /c del @path /F
Kräften der bestimmte Datei in einigen Fällen gelöscht werden kann die Datei nur gelesen werden.Das
dateYear
ist die Jahresvariable und dort können Sie den Subtrakt nach Ihren eigenen Bedürfnissen ändernquelle