PowerShell kullanarak 15 günden eski dosyaları silme


186

Yalnızca 15 günden daha önce belirli bir klasörde oluşturulmuş dosyaları silmek istiyorum. PowerShell kullanarak bunu nasıl yapabilirim?


5
Yanıtların çoğunda CreationTime kullanılır, ancak bir dosya kopyalandığında sıfırlanır, böylece istediğiniz sonuçları alamayabilirsiniz. LastWriteTime, Windows Gezgini'ndeki "Değiştirme Tarihi" ne karşılık gelir.
Roland Schaer

Yanıtlar:


308

Verilen yanıtlar yalnızca dosyaları silecektir (bu, kuşkusuz bu yazının başlığındadır), ancak burada ilk olarak 15 günden eski tüm dosyaları silecek ve daha sonra kalan boş dizinleri tekrar tekrar silecek arkasında. Kodum ayrıca -Forcegizli ve salt okunur dosyaları da silme seçeneğini kullanır . Ayrıca, OP PowerShell yeni olduğu gibi adlar kullanmayın seçti ve anlamak olmayabilir gci, ?, %vardır, vb.

$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

Ve elbette hangi dosyaları / klasörleri gerçekten silmeden önce silineceğini görmek istiyorsanız, -WhatIfanahtarı Remove-Itemher iki satırın sonunda cmdlet çağrısına ekleyebilirsiniz .

Burada gösterilen kod PowerShell v2.0 uyumludur, ancak bu kodu ve daha hızlı PowerShell v3.0 kodunu blogumda kullanışlı yeniden kullanılabilir işlevler olarak da göstereceğim .


22
Takma ad kullanmadığınız için teşekkür ederiz. Powershell'de yeni olan ve bu yayını bir Google aramasıyla bulan biri için cevabınızın en iyisi olduğunu düşünüyorum.
Geoff Dawdy

1
@ Deadlydog'un önerisini denedim ve aylar (veya son zamanlarda) değişen dosya oluşturma tarihleri ​​ile -15 veya -35 belirtirseniz, dizinin tüm içeriğini silerim.
Michele

6
Dosyalar kullanılıyorsa, RemoveItem komutuna "-ErrorAction SilentlyContinue" eklemeye de değer.
Kevin Owen

17
Teşekkürler! $ _ Yerine $ _. LastwriteTime kullanıyorum. CreationTime
Lauri Lubi

2
Bu komut dosyasındaki ikinci komut her zaman Get-ChildItem öğesinin yolun bir bölümünü bulamadığı bir hata alır. İstisna bulunamadı bir dizin alır. Yine de boş klasörleri sorunsuz bir şekilde siler. Çalışmaya rağmen neden hata aldığından emin değilim.
Nathan McKaskle

51

sadece (PowerShell V5)

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

16

Başka bir yol, geçerli tarihten 15 gün çıkarmak ve CreationTimebu değerle karşılaştırmaktır :

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

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

13

Temel olarak, verilen yol altındaki dosyalar üzerinde yineleme yapar CreationTime, geçerli saatten bulunan her dosyanın çıkarılmasını sağlar Daysve sonucun özelliğiyle karşılaştırırsınız . -WhatIfAslında (dosyalar silinecek olan) dosyaları silmeden ne olacağını aslında dosyaları silmek için anahtar anahtarı kaldırmak söyleyecektir:

$old = 15
$now = Get-Date

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

8

Bunu dene:

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

Sonuncusunun -recurseçok fazla olduğuna inanıyorum , değil mi? Dir listeleme özyinelemeli, öğenin silinmesi dahil edilen çocuklarla olmamalıdır, değil mi?
Joost

Çalıştığınız dizin iki dizin derinliğinde ise ikinci bir tekrar gerekir.
Bryan

5

Esperento57'nın komut dosyası eski PowerShell sürümlerinde çalışmaz. Bu örnek şunları yapar:

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
Şimdi dizinleri hariç tutmak için cevabımı güncelledim, teşekkürler.
KERR

3

Başka bir alternatif (15. otomatik olarak [zaman aralığına] yazılır):

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

Bu işlem eski klasörleri ve içeriğini silecektir.


0

Windows 10 kutusunu yukarıdaki örneklerle sorunlarınız varsa, değiştirmeyi deneyin .CreationTimeile .LastwriteTime. Bu benim için çalıştı.

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

LastwriteTimeaynı değildir CreationTime, LastwriteTimedosya her değiştiğinde güncelleştirmek olduğunu.
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"
    }
}

Ayrıca, asla else ifadesine ulaşmaz , çünkü $Filesboşsa foreach ifadesine girmez . Foreach ifadesini if ifadesine yerleştirmelisiniz.
Dieter

@mati aslında else deyimine ulaşabilir. Bir dosya listesine dayalı döngü için benzer bir var ve düzenli olarak $ File değişkeni ile for döngüsüne null olarak girer
BeowulfNode42

Tahmin ediyorum ki burada sadece aynı senaryo karşısında tökezledi; networknet.nl/apps/wp/published/…
Shawson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.