Saya ingin menghapus hanya file yang dibuat lebih dari 15 hari yang lalu di folder tertentu. Bagaimana saya bisa melakukan ini menggunakan PowerShell?
Saya ingin menghapus hanya file yang dibuat lebih dari 15 hari yang lalu di folder tertentu. Bagaimana saya bisa melakukan ini menggunakan PowerShell?
Jawaban:
Jawaban yang diberikan hanya akan menghapus file (yang memang merupakan apa yang ada dalam judul posting ini), tetapi di sini ada beberapa kode yang pertama-tama akan menghapus semua file yang lebih lama dari 15 hari, dan kemudian secara rekursif menghapus direktori kosong yang mungkin tersisa. dibelakang. Kode saya juga menggunakan -Forceopsi untuk menghapus file yang tersembunyi dan hanya-baca juga. Juga, saya memilih untuk tidak menggunakan alias sebagai OP baru untuk PowerShell dan mungkin tidak mengerti apa gci, ?, %, dll.
$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
Dan tentu saja jika Anda ingin melihat file / folder apa yang akan dihapus sebelum benar-benar menghapusnya, Anda bisa menambahkan -WhatIfsakelar ke Remove-Itempanggilan cmdlet di akhir kedua baris.
Kode yang ditampilkan di sini kompatibel dengan PowerShell v2.0, tetapi saya juga menunjukkan kode ini dan kode PowerShell v3.0 yang lebih cepat sebagai fungsi berguna yang dapat digunakan kembali di blog saya .
cukup sederhananya (PowerShell V5)
Get-ChildItem "C:\temp" -Recurse -File | Where CreationTime -lt (Get-Date).AddDays(-15) | Remove-Item -Force
Cara lain adalah dengan mengurangi 15 hari dari tanggal saat ini dan membandingkannya CreationTimedengan nilai itu:
$root = 'C:\root\folder'
$limit = (Get-Date).AddDays(-15)
Get-ChildItem $root -Recurse | ? {
-not $_.PSIsContainer -and $_.CreationTime -lt $limit
} | Remove-Item
Pada dasarnya, Anda beralih pada file di bawah jalur yang diberikan, kurangi CreationTimesetiap file yang ditemukan dari waktu saat ini, dan bandingkan dengan Daysproperti hasil. The -WhatIfswitch akan memberitahu Anda apa yang akan terjadi tanpa benar-benar menghapus file (file mana yang akan dihapus), menghapus saklar untuk benar-benar menghapus file:
$old = 15
$now = Get-Date
Get-ChildItem $path -Recurse |
Where-Object {-not $_.PSIsContainer -and $now.Subtract($_.CreationTime).Days -gt $old } |
Remove-Item -WhatIf
Coba ini:
dir C:\PURGE -recurse |
where { ((get-date)-$_.creationTime).days -gt 15 } |
remove-item -force
-recurseterlalu banyak, bukan? Daftar dir adalah secara rekursif, penghapusan item tidak boleh termasuk anak-anak, kan?
Skrip Esperento57 tidak berfungsi di versi PowerShell yang lebih lama. Contoh ini tidak:
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
Jika Anda mengalami masalah dengan contoh di atas pada kotak Windows 10, coba ganti .CreationTimedengan .LastwriteTime. Ini berhasil untuk saya.
dir C:\locationOfFiles -ErrorAction SilentlyContinue | Where { ((Get-Date)-$_.LastWriteTime).days -gt 15 } | Remove-Item -Force
LastwriteTimetidak sama dengan CreationTime, LastwriteTimediperbarui setiap kali file diubah.
#----- 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"
}
}
$Filesini kosong itu tidak akan masuk foreach pernyataan. Anda harus menempatkan foreach dalam pernyataan if .