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?
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?
Câu trả lời:
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 -Force
tù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 -WhatIf
tắc vào Remove-Item
lệ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 .
chỉ đơn giản (PowerShell V5)
Get-ChildItem "C:\temp" -Recurse -File | Where CreationTime -lt (Get-Date).AddDays(-15) | Remove-Item -Force
Một cách khác là trừ 15 ngày kể từ ngày hiện tại và so sánh CreationTime
với giá trị đó:
$root = 'C:\root\folder'
$limit = (Get-Date).AddDays(-15)
Get-ChildItem $root -Recurse | ? {
-not $_.PSIsContainer -and $_.CreationTime -lt $limit
} | Remove-Item
Về cơ bản, bạn lặp lại các tệp theo đường dẫn đã cho, trừ đi CreationTime
từ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 Days
tính của kết quả. Công -WhatIf
tắ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
Thử cái này:
dir C:\PURGE -recurse |
where { ((get-date)-$_.creationTime).days -gt 15 } |
remove-item -force
-recurse
là 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?
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
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ế .CreationTime
bằ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
LastwriteTime
không giống như CreationTime
, LastwriteTime
được cập nhật mỗi khi tệp được sửa đổi.
#----- 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"
}
}
$Files
trống, nó sẽ không nhập câu lệnh foreach . Bạn nên đặt foreach trong nếu tuyên bố.