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 -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 .
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 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
              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
              Thử cái này:
dir C:\PURGE -recurse | 
where { ((get-date)-$_.creationTime).days -gt 15 } | 
remove-item -force
              -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?
                    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ế .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.
                    #----- 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"
    }
}
              $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ố.