Hapus File yang Lebih Lama dari (x) Hari?

31

Apa pilihan baris perintah Windows yang baik untuk menghapus semua file dalam folder yang diberikan lebih dari (n) hari?

Perhatikan juga mungkin ada ribuan file-file ini, jadi forfilesdengan sebuah shell cmdbukanlah ide yang bagus di sini .. kecuali Anda suka memunculkan ribuan shell perintah. Saya menganggap itu peretasan yang cukup buruk, jadi mari kita lihat apakah kita bisa melakukan yang lebih baik!

Idealnya, sesuatu dibangun ke dalam (atau mudah diinstal ke dalam) Windows Server 2008.

Jeff Atwood
sumber
2
Metode baru yang didasarkan pada file .BAT yang menggunakan perintah CMD.EXE internal hanya telah diposting di sini: stackoverflow.com/questions/9746778/…

Jawaban:

43

Saya melihat sekeliling sedikit lebih banyak dan menemukan cara PowerShell :

Hapus semua file yang berumur lebih dari 8 hari dari folder yang ditentukan (dengan pratinjau)

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

(hapus -whatif untuk mewujudkannya)

Jeff Atwood
sumber
1
Untuk mengonfirmasi, apakah ini menghapus file secara permanen atau mendaur ulangnya?
TimS
Ops terlalu sulit untuk dihafal !! Saya suka PowerShell tapi saya pikir cara yang lebih baik adalah menggunakan robocopy
AminM
7

Suka perintah Jeff PowerShell, tetapi untuk solusi vbs alternatif untuk mesin Windows tanpa PowerShell Anda bisa mencoba yang berikut ini.

Simpan sebagai <filename>.vbsdan jalankan:

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

Parameter ketiga, [Action]adalah opsional. Tanpanya file yang lebih tua dari yang <NoDaysSinceModified>akan terdaftar. Dengan itu diatur karena Dakan menghapus file yang lebih tua dari<NoDaysSinceModified>

Contoh

PurgeOldFiles.vbs "c:\Log Files" 8

akan mendaftar semua file yang c:\Log Filesberumur lebih dari 8 hari

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

akan menghapus semua file yang c:\Log Filesberumur lebih dari 8 hari

Catatan: ini adalah versi modifikasi dari skrip Haidong Ji di 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
sumber
Saya menggunakan sesuatu seperti ini untuk menghapus log server web lama. Sudah bekerja dengan cukup baik.
jeffspost
4

Tidak benar-benar baris perintah, tapi saya suka menggunakan LINQPad sebagai host skrip C #:
(yang baru saja memberi saya ide untuk baris perintah C # scripting file thingie à 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);
Lucas
sumber
Linq benar-benar luar biasa, saya berharap akan membawa ke PowerShell.
Taylor Gibb
4

Lihatlah http://sourceforge.net/projects/delold ini karena inilah yang saya gunakan.

sederhana tetapi berhasil. delold -d 14 Menghapus file yang lebih lama yang 14 hari di folder saat ini.

Ian Stewart
sumber
3

Hal serupa dapat dicapai dengan perintah "find" cygwin (atau alternatif lain). Tetapi ini akan mengharuskan Anda untuk menginstal cygwin atau memiliki versi portabel.

Moshe
sumber
2

Saya menggunakan autoIT untuk mencapai ini pada sistem saya. Saya suka bahwa Anda dapat mengkompilasi file .au3 untuk exe dengan mudah. Tidak mudah untuk memperkenalkan kelemahan keamanan seperti halnya dengan file bat yang dapat diedit siapa pun.

DaffyDuc
sumber