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.

7voto

Aidan Ewen Punkte 12439

Verwenden Sie forfiles.

Es gibt verschiedene Versionen. Frühe Versionen verwenden Parameter im Unix-Stil.

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

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

Um forfiles zu XP hinzuzufügen, laden Sie die exe-Datei von ftp://ftp.microsoft.com/ResKit/y2kfix/x86/

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

11 Stimmen

@Kibbee es ist nicht die gleiche Antwort, die Syntax ist anders. Dies war ein genialer Versuch zu helfen. Da ich mich mit der Windows-Befehlszeile nur wenig auskenne, habe ich viele Stunden damit verbracht, dies zum Laufen zu bringen. Die wichtigsten Informationen für mich waren die Tatsache, dass es verschiedene Versionen (mit unterschiedlicher Syntax) gibt und dass ich die Leerzeichen entfernen muss. Keiner dieser Punkte war in der ursprünglichen Antwort enthalten. (Ich hätte die Antwort kommentiert, aber ich habe nicht die Rechte dazu.

0 Stimmen

Der gleiche Fehler wie in anderen Antworten (einschließlich der akzeptierten). Platzhalter *.* en forfiles stimmt nicht überein todo Dateien. Es werden nur Dateien mit . in ihren Namen enthalten (d. h. Dateien mit Erweiterungen). Die OP sagte nie etwas über die Anforderung . im Dateinamen. Der richtige Parameter ist /M * aber das ist ohnehin die Standardeinstellung. Es besteht keine Notwendigkeit für /M überhaupt nicht.

6voto

Graham Laight Punkte 4338

IMO wird JavaScript allmählich zu einem universellen Skripting-Standard: Es ist wahrscheinlich in mehr Produkten verfügbar als jede andere Skriptsprache (in Windows ist es über den Windows Scripting Host verfügbar). Ich muss alte Dateien in vielen Ordnern löschen. Hier ist eine JavaScript-Funktion, die das erledigt:

// 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ür jeden zu löschenden Ordner fügen Sie einfach einen weiteren Aufruf der Funktion clearFolder() hinzu. Dieser spezielle Code bewahrt auch exe- und dll-Dateien und bereinigt auch Unterordner.

6voto

Sting Punkte 323

Gestatten Sie mir, einen bescheidenen Beitrag zu diesem bereits wertvollen Thema zu leisten. Ich finde, dass andere Lösungen den eigentlichen Fehlertext loswerden könnten, aber ignorieren die %ERRORLEVEL%, die einen Fehler in meiner Anwendung signalisiert. Und ich will %ERRORLEVEL%, solange es sich nicht um den Fehler "Keine Dateien gefunden" handelt.

Einige Beispiele:

Fehlersuche und -beseitigung im Einzelnen:

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

Verwendung eines Einzeilers zur Rückgabe von ERRORLEVEL Erfolg oder Misserfolg:

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

Verwendung eines Oneliners, um den ERRORLEVEL im Kontext einer Batchdatei inmitten von anderem Code auf Null zu halten (ver > nul setzt den 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

Bei einem SQL Server Agent CmdExec-Auftragsschritt bin ich auf folgendes gestoßen. Ich weiß nicht, ob es ein Fehler ist, aber der 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%

6voto

J.R. Punkte 61

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

Das ist in weniger als 10 Zeilen Code möglich!

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

Bearbeitung durch Mofi:

Die obige Bedingung wurde durch J.R. wertet immer zu falsch wegen einer ungültigen Syntax.

Und Month GEQ 2 ist ebenfalls falsch, weil die Addition von 86400 Sekunden für einen weiteren Tag in einem Schaltjahr nur für die Monate März bis Dezember, nicht aber für den Februar vorgenommen werden muss.

Ein funktionierender Code zur Berücksichtigung von Schalttagen - nur im aktuellen Jahr - in einer Batch-Datei 7TageReinigen.cmd aufgestellt von Jota 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

5voto

GBGOLC Punkte 460

Donnerwetter, das sind schon eine Menge Antworten. Ein einfacher und bequemer Weg, den ich gefunden habe, war, ROBOCOPY.EXE zweimal hintereinander von einem einzigen Windows-Befehlszeilenbefehl aus auszuführen, indem ich die & Parameter.

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

In diesem Beispiel funktioniert es, indem alle Dateien ( . ), die älter als 30 Tage sind, und verschiebt sie in den Zielordner. Der zweite Befehl macht das Gleiche noch einmal mit dem Zusatz der PURGE Befehl, der bedeutet, dass Dateien im Zielordner entfernt werden, die im Quellordner nicht vorhanden sind. Im Wesentlichen verschiebt der erste Befehl also Dateien und der zweite löscht sie, weil sie im Quellordner nicht mehr vorhanden sind, wenn der zweite Befehl aufgerufen wird.

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

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