¿Eliminar archivos anteriores a (x) días?

31

¿Cuál es una buena opción de línea de comandos de Windows para eliminar todos los archivos en una carpeta dada anterior a (n) días?

También tenga en cuenta que puede haber muchos miles de estos archivos, por lo que forfilescon un shell cmdno es una gran idea aquí ... a menos que le guste generar miles de shells de comandos. Considero que es un truco bastante desagradable, ¡así que veamos si podemos hacerlo mejor!

Idealmente, algo integrado (o fácilmente instalable) en Windows Server 2008.

Jeff Atwood
fuente
2
Aquí se ha publicado un nuevo método basado en un archivo .BAT que usa comandos CMD.EXE internos: stackoverflow.com/questions/9746778/…

Respuestas:

43

Miré a mi alrededor un poco más y encontré una forma de PowerShell :

Eliminar todos los archivos de más de 8 días de antigüedad de la carpeta especificada (con vista previa)

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

(elimine el -whatif para que suceda)

Jeff Atwood
fuente
1
Para confirmar, ¿esto elimina permanentemente los archivos o los recicla?
TimS
Ops demasiado duro para memorizar !! amo PowerShell, pero creo que mejor forma es utilizar robocopy
AminM
7

Me encanta el comando PowerShell de Jeff, pero para una solución vbs alternativa para máquinas Windows sin PowerShell, puede intentar lo siguiente.

Guardar como <filename>.vbsy ejecutar:

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

El tercer parámetro, [Action]es opcional. Sin ella, los archivos anteriores <NoDaysSinceModified>serán listados. Con esto configurado D, eliminará archivos anteriores a<NoDaysSinceModified>

Ejemplo

PurgeOldFiles.vbs "c:\Log Files" 8

será una lista de todos los archivos de c:\Log Filesmás de 8 días de edad

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

será eliminar todos los archivos de c:\Log Filesmás de 8 días de edad

nota: esta es una versión modificada del script de Haidong Ji en 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
fuente
Utilizo algo como esto para eliminar los viejos registros del servidor web. Ha funcionado bastante bien.
jeffspost
4

En realidad, no es la línea de comandos, pero me gusta usar LINQPad como un host de secuencias de comandos C #:
(lo que me dio una idea para una línea de comandos C # scripting thingie à la vbs files)

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
fuente
Linq es realmente increíble, desearía que lo trajeran a PowerShell.
Taylor Gibb
3

Algo similar se puede lograr con el comando "encontrar" de cygwin (u otra alternativa). Pero esto requeriría que instales cygwin o tengas la versión portátil a mano.

Moshe
fuente
2

Utilizo autoIT para lograr esto en mis sistemas. Me gusta que pueda compilar archivos .au3 para ejecutar fácilmente. No es tan fácil introducir una falla de seguridad como lo es con un archivo bat que cualquiera puede editar.

DaffyDuc
fuente