Excluir arquivos com mais de (x) dias?

31

O que é uma boa opção de linha de comando do Windows para excluir todos os arquivos em uma determinada pasta com mais de (n) dias?

Observe também que pode haver muitos milhares desses arquivos, portanto, forfilescom um shell para cmdnão é uma boa idéia aqui .. a menos que você goste de gerar milhares de shells de comando. Eu considero isso um truque bastante desagradável, então vamos ver se podemos fazer melhor!

Idealmente, algo incorporado (ou facilmente instalável) no Windows Server 2008.

Jeff Atwood
fonte
2
Um novo método baseado em um arquivo .BAT que usa comandos CMD.EXE internos somente foi publicado aqui: stackoverflow.com/questions/9746778/…

Respostas:

43

Olhei em volta um pouco mais e encontrei uma maneira do PowerShell :

Exclua todos os arquivos com mais de 8 dias da pasta especificada (com visualização)

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

(remova o que for necessário para que isso aconteça)

Jeff Atwood
fonte
11
Para confirmar, isso exclui permanentemente os arquivos ou os recicla?
TimS 18/10/2013
Ops muito difícil para memorizar !! eu amo PowerShell, mas eu acho que a melhor maneira é usar robocopy
AminM
7

Adore o comando PowerShell de Jeff, mas para uma solução vbs alternativa para máquinas Windows sem o PowerShell, você pode tentar o seguinte.

Salve como <filename>.vbse execute:

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

O terceiro parâmetro, [Action]é opcional. Sem ele, os arquivos mais antigos <NoDaysSinceModified>serão listados. Com isso definido, Dele excluirá os arquivos anteriores a<NoDaysSinceModified>

Exemplo

PurgeOldFiles.vbs "c:\Log Files" 8

irá listar todos os arquivos em c:\Log Filesmais de 8 dias de idade

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

irá apagar todos os arquivos em c:\Log Filesmais de 8 dias de idade

nota: esta é uma versão modificada do script de Haidong Ji no 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
fonte
Eu uso algo assim para excluir logs antigos de servidores da web. Funcionou muito bem.
jeffspost
4

Não é realmente a linha de comando, mas eu gosto de usar o LINQPad como um host de script em C #:
(o que me deu uma idéia para uma coisa de script em C # de linha de comando nos arquivos vbs)

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
fonte
O Linq é realmente incrível, eu gostaria que o PowerShell fosse trazido.
Taylor Gibb
4

Dê uma olhada neste http://sourceforge.net/projects/delold, pois é isso que eu uso.

simples, mas funciona. delold -d 14 Exclui arquivos com mais de 14 dias na pasta atual.

Ian Stewart
fonte
3

Algo semelhante pode ser alcançado com o comando "find" do cygwin (ou outra alternativa). Mas isso exigiria a instalação do cygwin ou a versão portátil em mãos.

Moshe
fonte
2

Eu uso o autoIT para fazer isso nos meus sistemas. Eu gosto que você pode compilar arquivos .au3 para executar facilmente. Não é tão fácil introduzir uma falha de segurança quanto em um arquivo bat que qualquer um pode editar.

DaffyDuc
fonte