it-swarm.asia

احذف الملفات التي مضى عليها أكثر من 15 يومًا باستخدام PowerShell

أود فقط حذف الملفات التي تم إنشاؤها قبل أكثر من 15 يومًا في مجلد معين. كيف يمكنني القيام بذلك باستخدام PowerShell؟

160
user2470170

ستؤدي الإجابات المحددة فقط إلى حذف الملفات (والتي من المسلم به أنها موجودة في عنوان هذا المنشور) ، ولكن إليك بعض التعليمات البرمجية التي ستحذف أولاً جميع الملفات التي مضى عليها أكثر من 15 يومًا ، ثم تحذف بشكل متكرر أية أدلة فارغة قد تكون قد تركت خلف. يستخدم الرمز الخاص بي أيضًا خيار -Force لحذف الملفات المخفية والقراءة فقط. أيضًا ، اخترت عدم استخدام الأسماء المستعارة لأن OP جديد في PowerShell وقد لا أفهم ماهية gci و ? و % وما إلى ذلك.

$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

وبالطبع إذا كنت تريد معرفة الملفات/المجلدات التي سيتم حذفها قبل حذفها فعليًا ، يمكنك فقط إضافة رمز -WhatIf إلى مكالمة cmdlet Remove-Item في نهاية كلا الخطين.

الرمز المعروض هنا متوافق مع PowerShell v2.0 ، لكنني أيضًا أعرض هذا الرمز ورمز PowerShell v3.0 الأسرع كـ وظائف مفيدة قابلة لإعادة الاستخدام في مدونتي .

269
deadlydog

فقط ببساطة (PowerShell V5)

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

هناك طريقة أخرى تتمثل في طرح 15 يومًا من التاريخ الحالي ومقارنة CreationTime بهذه القيمة:

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

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

في الأساس ، تقوم بالتكرار على الملفات الموجودة تحت المسار المحدد ، وطرح CreationTime لكل ملف تم العثور عليه من الوقت الحالي ، وقارن مقابل خاصية Days للنتيجة. سيخبرك رمز التبديل -WhatIf بما سيحدث دون حذف الملفات فعليًا (أي الملفات سيتم حذفها) ، وإزالة رمز التبديل لحذف الملفات فعليًا:

$old = 15
$now = Get-Date

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

جرب هذا:

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

لا يعمل البرنامج النصي Esperento57 في إصدارات PowerShell الأقدم. هذا المثال يفعل:

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
5
KERR

بديل آخر (15. تتم كتابته على [timespan] تلقائيًا):

ls -file | where { (get-date) - $_.creationtime -gt 15. } | Remove-Item -Verbose
2
js2010
$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

سيؤدي هذا إلى حذف المجلدات القديمة ومحتواها.

1
Aigar