Excluir arquivos mais antigos que (x) dias?

30

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, então forfiles com um shell para cmd não é uma ótima idéia aqui ... a menos que você goste de gerar milhares de shells de comando. Eu considero um hack bastante desagradável, então vamos ver se podemos fazer melhor!

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

    
por Jeff Atwood 04.08.2009 / 07:30

7 respostas

42

Eu olhei em volta um pouco mais e encontrou uma maneira de powershell :

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

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

(remova o -whatif para que isso aconteça)

    
por 04.08.2009 / 07:40
6

Comando PowerShell do Jeff, mas para uma solução vbs alternativa para computadores Windows sem o PowerShell, você pode tentar o seguinte.

Salvar como <filename>.vbs e executar:

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

O terceiro parâmetro, [Action] é opcional. Sem ele, os arquivos com mais de <NoDaysSinceModified> serão listados. Com ele definido como D , ele excluirá arquivos com mais de <NoDaysSinceModified>

Exemplo

PurgeOldFiles.vbs "c:\Log Files" 8

irá listar todos os arquivos em c:\Log Files com mais de 8 dias de idade

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

irá eliminar todos os ficheiros em c:\Log Files com mais de 8 dias de idade

nota: esta é uma versão modificada do script de Haidong Ji em 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
    
por 04.08.2009 / 14:10
3

Não é realmente linha de comando, mas eu gosto de usar o LINQPad como um host de script C #:
(o que acabou de me dar uma idéia para uma linha de comando c # scripting coisa com os 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);
    
por 05.08.2009 / 16:26
3

Dê uma olhada neste link , pois é isso que eu uso.

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

    
por 06.08.2009 / 23:29
2

Algo similar pode ser alcançado com o comando "find" do cygwin (ou outra alternativa). Mas isso exigiria que você instalasse o cygwin ou tivesse a versão portátil à mão.

    
por 04.08.2009 / 10:00
1

Outra alternativa que costumava usar antes do powershell:

link

    
por 05.08.2009 / 06:44
1

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

    
por 17.03.2012 / 06:46