sviluppo-web-qa.it

Eliminare file più vecchi di (x) giorni?

Qual è una buona opzione della riga di comando di Windows per eliminare tutti i file in una determinata cartella più vecchia di (n) giorni?

Nota anche che potrebbero esserci molte migliaia di questi file, quindi forfiles con una shell su cmd non è una grande idea qui ... a meno che non ti piaccia generare migliaia di shell di comandi. Lo considero un brutto trucco, quindi vediamo se possiamo fare di meglio!

Idealmente, qualcosa integrato in (o facilmente installabile in) Windows Server 2008.

31
Jeff Atwood

Mi sono guardato un po 'di più e ho trovato un modo PowerShell :

Elimina tutti i file più vecchi di 8 giorni dalla cartella specificata (con anteprima)

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

(rimuovi il -whatif per farlo accadere)

44
Jeff Atwood

Adoro il comando PowerShell di Jeff, ma per una soluzione vbs alternativa per macchine Windows senza PowerShell puoi provare quanto segue.

Salva come <filename>.vbs ed esegui:

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

Il terzo parametro, [Action] è facoltativo. Senza di essa i file più vecchi di <NoDaysSinceModified> verrà elencato. Con l'impostazione come D eliminerà i file più vecchi di <NoDaysSinceModified>

Esempio

PurgeOldFiles.vbs "c:\Log Files" 8

elencherà tutti i file in c:\Log Files più vecchio di 8 giorni

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

eliminerà tutti i file in c:\Log Files più vecchio di 8 giorni

nota: questa è una versione modificata dello script di Haidong Ji su 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
7
PaulPlum

Dai un'occhiata a questo http://sourceforge.net/projects/delold poiché è quello che uso.

semplice ma funziona. delold -d 14 Elimina i file più vecchi di 14 giorni nella cartella corrente.

4
Ian Stewart

Non proprio riga di comando, ma mi piace usare LINQPad come host di scripting C #:
(che mi ha appena dato un'idea per una riga di comando C # cosa scripting à i file 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);
4
Lucas

Qualcosa di simile può essere ottenuto con il comando "trova" di cygwin (o altra alternativa). Ma ciò richiederebbe l'installazione di Cygwin o la versione portatile a portata di mano.

3
Moshe

Un'altra alternativa che usavo prima di PowerShell:

http://lifehacker.com/133190/geek-to-live--hard-drive-janitor

2
JakeRobinson

Uso autoIT per realizzare ciò sui miei sistemi. Mi piace il fatto che puoi compilare file .au3 per exe facilmente. Non è facile introdurre un difetto di sicurezza come lo è con un file bat che chiunque può modificare.

2
DaffyDuc