Yalnızca 15 günden daha önce belirli bir klasörde oluşturulmuş dosyaları silmek istiyorum. PowerShell kullanarak bunu nasıl yapabilirim?
Yalnızca 15 günden daha önce belirli bir klasörde oluşturulmuş dosyaları silmek istiyorum. PowerShell kullanarak bunu nasıl yapabilirim?
Yanıtlar:
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 -Force
gizli 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, -WhatIf
anahtarı Remove-Item
her 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 .
sadece (PowerShell V5)
Get-ChildItem "C:\temp" -Recurse -File | Where CreationTime -lt (Get-Date).AddDays(-15) | Remove-Item -Force
Başka bir yol, geçerli tarihten 15 gün çıkarmak ve CreationTime
bu 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
Temel olarak, verilen yol altındaki dosyalar üzerinde yineleme yapar CreationTime
, geçerli saatten bulunan her dosyanın çıkarılmasını sağlar Days
ve sonucun özelliğiyle karşılaştırırsınız . -WhatIf
Aslı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
Bunu dene:
dir C:\PURGE -recurse |
where { ((get-date)-$_.creationTime).days -gt 15 } |
remove-item -force
-recurse
çok fazla olduğuna inanıyorum , değil mi? Dir listeleme özyinelemeli, öğenin silinmesi dahil edilen çocuklarla olmamalıdır, değil mi?
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
Windows 10 kutusunu yukarıdaki örneklerle sorunlarınız varsa, değiştirmeyi deneyin .CreationTime
ile .LastwriteTime
. Bu benim için çalıştı.
dir C:\locationOfFiles -ErrorAction SilentlyContinue | Where { ((Get-Date)-$_.LastWriteTime).days -gt 15 } | Remove-Item -Force
LastwriteTime
aynı değildir CreationTime
, LastwriteTime
dosya her değiştiğinde güncelleştirmek olduğunu.
#----- 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
boşsa foreach ifadesine girmez . Foreach ifadesini if ifadesine yerleştirmelisiniz.