Eliminare file più vecchi di (x) giorni?


31

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 forfilescon una shell cmdnon è 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.


2
Un nuovo metodo basato in un file bat che utilizzano i comandi interni CMD.EXE solo è stato postato qui: stackoverflow.com/questions/9746778/...

Risposte:


43

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)


1
Per confermare, questo elimina definitivamente i file o li ricicla?
TimS,

Op troppo difficile da memorizzare !! Adoro Powershell ma penso che il modo migliore sia usare Robocopy
AminM,

7

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

Salva con nome <filename>.vbsed eseguire:

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

Il terzo parametro [Action]è facoltativo. Senza di essa <NoDaysSinceModified>verranno elencati i file più vecchi di . Con esso impostato in Dquanto eliminerà i file più vecchi di<NoDaysSinceModified>

Esempio

PurgeOldFiles.vbs "c:\Log Files" 8

sarà elencare tutti i file in c:\Log Filespiù vecchio di 8 giorni

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

si elimina tutti i file in c:\Log Filespiù 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

Uso qualcosa del genere per eliminare i vecchi registri del web server. Ha funzionato abbastanza bene.
jeffspost,

4

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

Linq è davvero fantastico, vorrei che entrasse in PowerShell.
Taylor Gibb,


3

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.



2

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.