Dateien löschen, die älter als (x) Tage sind?

31

Was ist eine gute Windows-Befehlszeilenoption zum Löschen aller Dateien in einem bestimmten Ordner, die älter als (n) Tage sind?

Beachten Sie auch, dass es möglicherweise viele Tausend solcher Dateien gibt. Daher ist die Verwendung forfileseiner Shell cmdhier keine gute Idee. Es sei denn, Sie möchten Tausende von Befehlsshells erstellen. Ich halte das für einen ziemlich fiesen Hack, also mal sehen, ob wir es besser machen können!

Idealerweise etwas, das in Windows Server 2008 integriert ist (oder problemlos in Windows Server 2008 installiert werden kann).

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

Antworten:

43

Ich habe mich ein bisschen mehr umgesehen und einen Powershell-Weg gefunden :

Löschen Sie alle Dateien, die älter als 8 Tage sind, aus dem angegebenen Ordner (mit Vorschau).

dir |? {$_.CreationTime -lt (get-date).AddDays(-8)} | del -whatif

(Entfernen Sie das -whatif, um dies zu ermöglichen.)

Jeff Atwood
quelle
1
Löscht dies zur Bestätigung die Dateien dauerhaft oder recycelt es sie?
TimS
Ich liebe Powershell, aber ich denke, ein besserer Weg ist die Verwendung von Robocopy
AminM
7

Ich liebe Jeffs PowerShell-Befehl, aber für eine alternative vbs-Lösung für Windows-Computer ohne PowerShell können Sie Folgendes versuchen.

Speichern unter <filename>.vbsund ausführen:

<filename>.vbs <target_dir> <NoDaysSinceModified> [Action]

Der dritte Parameter [Action]ist optional. Ohne sie werden die Dateien <NoDaysSinceModified>aufgelistet, die älter als sind. Mit dieser Einstellung Dwerden Dateien gelöscht, die älter als sind<NoDaysSinceModified>

Beispiel

PurgeOldFiles.vbs "c:\Log Files" 8

werden Liste aller Dateien in c:\Log Filesälter als 8 Tage alt

PurgeOldFiles.vbs "c:\Log Files" 8 D

wird löschen Sie alle Dateien in c:\Log Filesälter als 8 Tage alt

Hinweis: Dies ist eine modifizierte Version des Skripts von Haidong Ji auf SQLServerCentral.com

Option Explicit
on error resume next
    Dim oFSO
    Dim sDirectoryPath
    Dim oFolder
    Dim oFileCollection
    Dim oFile
    Dim iDaysOld
    Dim fAction

    sDirectoryPath = WScript.Arguments.Item(0)
    iDaysOld = WScript.Arguments.Item(1)
    fAction = WScript.Arguments.Item(2)
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    set oFolder = oFSO.GetFolder(sDirectoryPath)
    set oFileCollection = oFolder.Files

If UCase(fAction) = "D" Then
'Walk through each file in this folder collection. 
'If it is older than iDaysOld, then delete it.
    For each oFile in oFileCollection
        If oFile.DateLastModified < (Date() - iDaysOld) Then
            oFile.Delete(True)
        End If
    Next
else
'Displays Each file in the dir older than iDaysOld
    For each oFile in oFileCollection
        If oFile.DateLastModified < (Date() - iDaysOld) Then
            Wscript.Echo oFile.Name & " " & oFile.DateLastModified
        End If
    Next
End If


'Clean up
    Set oFSO = Nothing
    Set oFolder = Nothing
    Set oFileCollection = Nothing
    Set oFile = Nothing
    Set fAction = Nothing
PaulPlum
quelle
Ich verwende so etwas, um alte Web-Server-Protokolle zu löschen. Hat ganz gut geklappt.
Jeffspost
4

Nicht wirklich Kommandozeile, aber ich mag mit LINQPad als C # Scripting Host:
(was mir gerade gab eine Idee für eine Befehlszeile C # Scripting thingie à la vbs - Dateien)

var files = from f in Directory.GetFiles(@"D:\temp", "*.*", SearchOption.AllDirectories)
            where File.GetLastWriteTime(f) < DateTime.Today.AddDays(-8)
            select f;

foreach(var f in files)
    File.Delete(f);
Lucas
quelle
Linq ist wirklich großartig, ich wünschte, das würde PowerShell bringen.
Taylor Gibb
4

Schauen Sie sich diese http://sourceforge.net/projects/delold an, da dies das ist, was ich benutze.

einfach aber funktioniert. delold -d 14 Löscht Dateien, die älter als 14 Tage sind, im aktuellen Ordner.

Ian Stewart
quelle
3

Ähnliches kann mit dem Befehl "find" von cygwin (oder einer anderen Alternative) erreicht werden. Dafür müssten Sie jedoch cygwin installieren oder die portable Version zur Hand haben.

Moshe
quelle
2

Ich verwende autoIT, um dies auf meinen Systemen zu erreichen. Ich mag, dass Sie .au3-Dateien kompilieren können, um leicht exe. Es ist nicht so einfach, eine Sicherheitslücke einzuführen, wie dies bei einer Fledermausdatei der Fall ist, die jeder bearbeiten kann.

DaffyDuc
quelle