ลบไฟล์ที่เก่ากว่า (x) วันหรือไม่


31

ตัวเลือกบรรทัดคำสั่งของ Windows ที่ดีสำหรับการลบไฟล์ทั้งหมดในโฟลเดอร์ที่กำหนดไว้คืออะไร (n) วัน?

นอกจากนี้โปรดทราบว่าอาจมีไฟล์เหล่านี้หลายพันไฟล์ดังนั้นforfilesด้วยการใช้ shell to cmdจึงไม่ใช่ความคิดที่ดีที่นี่ .. เว้นแต่คุณจะชอบวางไข่เชลล์คำสั่งหลายพันตัว ฉันคิดว่าแฮ็คที่น่ารังเกียจลองมาดูกันว่าเราสามารถทำได้ดีกว่า!

เป็นการดีที่มีบางสิ่งใน (หรือติดตั้งได้ง่าย) Windows Server 2008


2
วิธีการใหม่ที่ใช้ไฟล์. BAT ที่ใช้คำสั่ง CMD.EXE ภายในเท่านั้นที่โพสต์ไว้ที่นี่: stackoverflow.com/questions/9746778/…

คำตอบ:


43

ฉันมองไปรอบ ๆ อีกเล็กน้อยและพบวิธีเสริมพลัง :

ลบไฟล์ทั้งหมดที่มีอายุมากกว่า 8 วันจากโฟลเดอร์ที่ระบุ (พร้อมดูตัวอย่าง)

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

(ลบเครื่องหมาย - เพื่อให้มันเกิดขึ้น)


1
หากต้องการยืนยันจะเป็นการลบไฟล์อย่างถาวรหรือนำไปรีไซเคิลหรือไม่
TimS

Ops ยากเกินไปสำหรับจดจำ !! ฉันรัก PowerShell แต่ฉันคิดว่าวิธีที่ดีกว่าคือการใช้robocopy
AminM

7

รักคำสั่ง PowerShell ของ Jeff แต่สำหรับโซลูชัน vbs ทางเลือกสำหรับเครื่อง Windows ที่ไม่มี PowerShell คุณสามารถลองทำสิ่งต่อไปนี้

บันทึกเป็น<filename>.vbsและดำเนินการ:

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

พารามิเตอร์ที่สาม[Action]เป็นทางเลือก หากไม่มีไฟล์เก่ากว่า<NoDaysSinceModified>นี้ก็จะปรากฏในรายการ ด้วยการตั้งค่าDมันจะลบไฟล์ที่เก่ากว่า<NoDaysSinceModified>

ตัวอย่าง

PurgeOldFiles.vbs "c:\Log Files" 8

จะแสดงรายการไฟล์ทั้งหมดในc:\Log Filesเก่ากว่า 8 วัน

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

จะลบไฟล์ทั้งหมดในc:\Log Filesเก่ากว่า 8 วัน

หมายเหตุ: นี่เป็นสคริปต์ของ Haidong Ji ที่แก้ไขแล้วใน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

ฉันใช้สิ่งนี้เพื่อลบบันทึกการใช้เว็บเซิร์ฟเวอร์เก่า ได้ผลออกมาค่อนข้างดี
jeffspost

4

ไม่ใช่บรรทัดคำสั่งจริงๆ แต่ฉันชอบใช้LINQPadเป็นโฮสต์การเขียนสคริปต์ C #:
(ซึ่งเพิ่งทำให้ฉันมีความคิดสำหรับบรรทัดคำสั่ง C # สคริปต์สิ่ง 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 ยอดเยี่ยมมากฉันหวังว่าจะนำเข้าสู่ PowerShell
เทย์เลอร์กิบบ์


3

สิ่งที่คล้ายกันสามารถทำได้ด้วยคำสั่ง "ค้นหา" ของ cygwin แต่สิ่งนี้จะทำให้คุณต้องติดตั้ง cygwin หรือมีรุ่นพกพาในมือ



2

ฉันใช้ autoIT เพื่อทำสิ่งนี้ให้สำเร็จในระบบของฉัน ฉันชอบที่คุณสามารถรวบรวมไฟล์. au3 เป็น exe ได้อย่างง่ายดาย ไม่ใช่เรื่องง่ายที่จะแนะนำข้อบกพร่องด้านความปลอดภัยเช่นเดียวกับไฟล์ bat ที่ทุกคนสามารถแก้ไขได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.