Xóa các tệp cũ hơn 15 ngày bằng PowerShell


186

Tôi chỉ muốn xóa các tệp đã được tạo hơn 15 ngày trước trong một thư mục cụ thể. Làm cách nào tôi có thể làm điều này bằng PowerShell?


5
Hầu hết các câu trả lời sử dụng CreationTime tuy nhiên nó được đặt lại khi tệp được sao chép để bạn có thể không nhận được kết quả mình muốn. LastWriteTime là những gì tương ứng với "Ngày sửa đổi" trong Windows Explorer.
Roland Schaer

Câu trả lời:


308

Các câu trả lời đã cho sẽ chỉ xóa các tệp (được thừa nhận là trong tiêu đề của bài đăng này), nhưng đây là một số mã trước tiên sẽ xóa tất cả các tệp cũ hơn 15 ngày, sau đó xóa đệ quy bất kỳ thư mục trống nào có thể còn sót lại phía sau. Mã của tôi cũng sử dụng -Forcetùy chọn để xóa các tệp ẩn và chỉ đọc. Ngoài ra, tôi đã chọn để không sử dụng bí danh như OP còn xa lạ với PowerShell và có thể không hiểu gì gci, ?, %, vv có.

$limit = (Get-Date).AddDays(-15)
$path = "C:\Some\Path"

# Delete files older than the $limit.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force

# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse

Và tất nhiên nếu bạn muốn xem những tập tin / thư mục nào sẽ bị xóa trước khi thực sự xóa chúng, bạn chỉ cần thêm công -WhatIftắc vào Remove-Itemlệnh gọi cmdlet ở cuối cả hai dòng.

Mã được hiển thị ở đây là tương thích PowerShell v2.0, nhưng tôi cũng hiển thị mã này và mã PowerShell v3.0 nhanh hơn như các chức năng tái sử dụng tiện dụng trên blog của tôi .


22
Cảm ơn bạn đã không sử dụng bí danh. Đối với một người mới biết về powershell và tìm thấy bài đăng này thông qua một tìm kiếm của Google, tôi coi câu trả lời của bạn là tốt nhất.
Geoff Dawdy

1
Tôi đã thử đề xuất của @ deadlydog và bất kể tôi chỉ định -15 hoặc -35 với các ngày tạo tệp khác nhau trong vài tháng trở lại (hoặc gần đây), nó sẽ xóa toàn bộ nội dung của thư mục.
Michele

6
Nếu các tệp có thể đang được sử dụng, nó cũng đáng để thêm "-ErrorAction SilentlyContinue" vào lệnh RemoveItem.
Kevin Owen

17
Cảm ơn! Tôi sử dụng $ _. LastwriteTime thay vì $ _. CreationTime
Lauri Lubi

2
Lệnh thứ hai trong tập lệnh đó luôn gặp lỗi mà Get-ChildItem không thể tìm thấy một phần của đường dẫn. Nó nhận được một thư mục không tìm thấy ngoại lệ. Tuy nhiên, nó xóa các thư mục trống mà không có vấn đề. Không chắc chắn tại sao nó nhận được một lỗi mặc dù làm việc.
Nathan McKaskle

51

chỉ đơn giản (PowerShell V5)

Get-ChildItem "C:\temp" -Recurse -File | Where CreationTime -lt  (Get-Date).AddDays(-15)  | Remove-Item -Force

16

Một cách khác là trừ 15 ngày kể từ ngày hiện tại và so sánh CreationTimevới giá trị đó:

$root  = 'C:\root\folder'
$limit = (Get-Date).AddDays(-15)

Get-ChildItem $root -Recurse | ? {
  -not $_.PSIsContainer -and $_.CreationTime -lt $limit
} | Remove-Item

13

Về cơ bản, bạn lặp lại các tệp theo đường dẫn đã cho, trừ đi CreationTimetừng tệp được tìm thấy từ thời điểm hiện tại và so sánh với thuộc Daystính của kết quả. Công -WhatIftắc sẽ cho bạn biết điều gì sẽ xảy ra mà không thực sự xóa các tệp (tệp nào sẽ bị xóa), xóa công tắc để thực sự xóa các tệp:

$old = 15
$now = Get-Date

Get-ChildItem $path -Recurse |
Where-Object {-not $_.PSIsContainer -and $now.Subtract($_.CreationTime).Days -gt $old } |
Remove-Item -WhatIf

8

Thử cái này:

dir C:\PURGE -recurse | 
where { ((get-date)-$_.creationTime).days -gt 15 } | 
remove-item -force

Tôi tin rằng cuối cùng -recurselà một quá nhiều, không? Danh sách dir là đệ quy, việc xóa các mục không nên có với trẻ em, phải không?
Joost

Nếu thư mục bạn đang làm việc có hai thư mục sâu thì cần có phần thứ hai.
Bryan S.

5

Kịch bản của Esperento57 không hoạt động trong các phiên bản PowerShell cũ hơn. Ví dụ này có:

Get-ChildItem -Path "C:\temp" -Recurse -force -ErrorAction SilentlyContinue | where {($_.LastwriteTime -lt  (Get-Date).AddDays(-15) ) -and (! $_.PSIsContainer)} | select name| Remove-Item -Verbose -Force -Recurse -ErrorAction SilentlyContinue

1
Tôi đã cập nhật câu trả lời của tôi để loại trừ các thư mục bây giờ, cảm ơn.
KERR

3

Một cách khác (tự động được gõ vào [timespan]):

ls -file | where { (get-date) - $_.creationtime -gt 15. } | Remove-Item -Verbose

1
$limit = (Get-Date).AddDays(-15)
$path = "C:\Some\Path"

# Delete files older than the $limit.
Get-ChildItem -Path $path -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force -Recurse

Điều này sẽ xóa các thư mục cũ và nội dung của nó.


0

Nếu bạn gặp vấn đề với các ví dụ trên trên hộp Windows 10, hãy thử thay thế .CreationTimebằng .LastwriteTime. Điều này làm việc cho tôi.

dir C:\locationOfFiles -ErrorAction SilentlyContinue | Where { ((Get-Date)-$_.LastWriteTime).days -gt 15 } | Remove-Item -Force

LastwriteTimekhông giống như CreationTime, LastwriteTimeđược cập nhật mỗi khi tệp được sửa đổi.
MisterSmith

-1
#----- Define parameters -----#
#----- Get current date ----#
$Now = Get-Date
$Days = "15" #----- define amount of days ----#
$Targetfolder = "C:\Logs" #----- define folder where files are located ----#
$Extension = "*.log" #----- define extension ----#
$Lastwrite = $Now.AddDays(-$Days)

#----- Get files based on lastwrite filter and specified folder ---#
$Files = Get-Children $Targetfolder -include $Extension -Recurse | where {$_.LastwriteTime -le "$Lastwrite"}

foreach ($File in $Files)
{
    if ($File -ne $Null)
    {
        write-host "Deleting File $File" backgroundcolor "DarkRed"
        Remove-item $File.Fullname | out-null
    }
    else
        write-host "No more files to delete" -forgroundcolor "Green"
    }
}

Ngoài ra, nó sẽ không bao giờ đạt được câu lệnh khác , vì nếu $Filestrống, nó sẽ không nhập câu lệnh foreach . Bạn nên đặt foreach trong nếu tuyên bố.
kiêng

@mati thực sự nó có thể đạt được các tuyên bố khác. Chúng tôi có một vòng lặp tương tự dựa trên danh sách tệp và nó thường xuyên vào vòng lặp for với biến $ File là null
BeowulfNode42

Tôi đoán vậy - chỉ tình cờ thấy kịch bản tương tự ở đây; networknet.nl/apps/wp/published/ từ
Shawson
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.