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 -Force
opsi 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 -WhatIf
sakelar ke Remove-Item
panggilan 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 CreationTime
dengan 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 CreationTime
setiap file yang ditemukan dari waktu saat ini, dan bandingkan dengan Days
properti hasil. The -WhatIf
switch 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
-recurse
terlalu 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 .CreationTime
dengan .LastwriteTime
. Ini berhasil untuk saya.
dir C:\locationOfFiles -ErrorAction SilentlyContinue | Where { ((Get-Date)-$_.LastWriteTime).days -gt 15 } | Remove-Item -Force
LastwriteTime
tidak sama dengan CreationTime
, LastwriteTime
diperbarui 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"
}
}
$Files
ini kosong itu tidak akan masuk foreach pernyataan. Anda harus menempatkan foreach dalam pernyataan if .