Xóa tập tin cũ hơn (x) ngày?


31

Tùy chọn dòng lệnh Windows nào tốt để xóa tất cả các tệp trong một thư mục đã cho cũ hơn (n) ngày?

Cũng lưu ý rằng có thể có hàng ngàn tệp này, vì vậy forfilesvới shell cmdkhông phải là ý tưởng hay ở đây .. trừ khi bạn thích sinh ra hàng ngàn shell lệnh. Tôi nghĩ rằng đó là một hack khá khó chịu, vì vậy hãy xem liệu chúng ta có thể làm tốt hơn không!

Lý tưởng nhất, một cái gì đó được tích hợp vào (hoặc có thể dễ dàng cài đặt vào) Windows Server 2008.


2
Một phương thức mới dựa trên tệp .BAT chỉ sử dụng các lệnh CMD.EXE nội bộ đã được đăng ở đây: stackoverflow.com/questions/9746778/

Câu trả lời:


43

Tôi nhìn xung quanh nhiều hơn một chút và tìm thấy một cách mạnh mẽ :

Xóa tất cả các tệp hơn 8 ngày tuổi khỏi thư mục được chỉ định (có bản xem trước)

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

(loại bỏ -whatif để làm cho nó xảy ra)


1
Để xác nhận, điều này có xóa vĩnh viễn các tập tin hoặc tái chế chúng không?
TimS

Ops quá khó để ghi nhớ !! Tôi yêu powershell nhưng tôi nghĩ cách tốt hơn là sử dụng robocopy
AminM

7

Yêu lệnh PowerShell của Jeff, nhưng đối với giải pháp vbs thay thế cho các máy Windows không có PowerShell, bạn có thể thử cách sau.

Lưu dưới dạng <filename>.vbsvà thực thi:

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

Tham số thứ ba, [Action]là tùy chọn. Không có nó các tập tin cũ hơn <NoDaysSinceModified>sẽ được liệt kê. Với nó được đặt vì Dnó sẽ xóa các tập tin cũ hơn<NoDaysSinceModified>

Thí dụ

PurgeOldFiles.vbs "c:\Log Files" 8

sẽ liệt kê tất cả các tệp trong c:\Log Fileshơn 8 ngày tuổi

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

sẽ xóa tất cả các tệp trong c:\Log Fileshơn 8 ngày tuổi

lưu ý: đây là phiên bản sửa đổi của tập lệnh của Haidong Ji trên 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

Tôi sử dụng một cái gì đó như thế này để xóa nhật ký máy chủ web cũ. Đã làm việc khá tốt.
16

4

Không thực sự là dòng lệnh, nhưng tôi thích sử dụng LINQPad làm máy chủ lưu trữ kịch bản C #:
(điều này chỉ cho tôi một ý tưởng cho một dòng lệnh C # scripting 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);

Linq thực sự tuyệt vời, tôi ước điều đó sẽ mang lại cho PowerShell.
Taylor Gibb


3

Một cái gì đó tương tự có thể đạt được với lệnh "tìm" của cygwin (hoặc thay thế khác). Nhưng điều này sẽ yêu cầu bạn cài đặt cygwin hoặc có sẵn phiên bản di động.



2

Tôi sử dụng autoIT để thực hiện điều này trên hệ thống của mình. Tôi thích rằng bạn có thể biên dịch các tập tin .au3 để exe dễ dàng. Không dễ để giới thiệu một lỗ hổng bảo mật như với một tập tin bat bất cứ ai cũng có thể chỉnh sửa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.