Menggunakan Powershell v2.0 Saya ingin menghapus file yang lebih lama dari X hari:
$backups = Get-ChildItem -Path $Backuppath |
Where-Object {($_.lastwritetime -lt (Get-Date).addDays(-$DaysKeep)) -and (-not $_.PSIsContainer) -and ($_.Name -like "backup*")}
foreach ($file in $backups)
{
Remove-Item $file.FullName;
}
Namun, ketika $ backup kosong saya dapatkan: Remove-Item : Cannot bind argument to parameter 'Path' because it is null.
Saya sudah mencoba:
- Melindungi muka dengan
if (!$backups)
- Melindungi Remove-Item dengan
if (Test-Path $file -PathType Leaf)
- Melindungi Remove-Item dengan
if ([IO.File]::Exists($file.FullName) -ne $true)
Tak satu pun dari ini tampaknya berfungsi, bagaimana jika cara yang disarankan untuk mencegah loop foreach dimasukkan jika daftar kosong?
powershell
SteB
sumber
sumber
Jawaban:
Dengan Powershell 3
foreach
pernyataan itu tidak berulang$null
dan masalah yang dijelaskan oleh OP tidak lagi terjadi.Dari posting Blog Windows PowerShell, Fitur Bahasa V3 Baru :
Untuk PowerShell
$PSVersionTable.PSVersion.Major -le 2
lihat berikut ini untuk jawaban yang asli.Anda memiliki dua opsi, saya kebanyakan menggunakan yang kedua.
Periksa
$backups
untuk tidak$null
. Sederhana diIf
sekitar loop dapat memeriksa tidak$null
Atau
Inisialisasi
$backups
sebagai array nol. Ini menghindari ambiguitas masalah "iterate empty array" yang Anda tanyakan dalam pertanyaan terakhir Anda .Maaf, saya lalai memberikan contoh mengintegrasikan kode Anda. Perhatikan
Get-ChildItem
cmdlet yang terbungkus dalam array. Ini juga akan berfungsi dengan fungsi yang dapat mengembalikan a$null
.sumber
Saya tahu ini adalah posting lama tapi saya ingin menunjukkan bahwa cmdlet ForEach-Object tidak mengalami masalah yang sama dengan menggunakan kata kunci ForEach. Jadi, Anda dapat mem-pipe hasil DIR ke ForEach dan hanya mereferensikan file menggunakan $ _, seperti:
Anda benar-benar dapat meneruskan perintah Dir itu sendiri melalui pipa dan menghindari bahkan menetapkan variabel seperti:
Saya menambahkan jeda baris untuk keterbacaan.
Saya mengerti beberapa orang seperti ForEach / In untuk keterbacaan. Terkadang ForEach-object bisa sedikit berbulu, terutama jika Anda bersarang karena sulit untuk mengikuti referensi $ _. Bagaimanapun, untuk operasi kecil seperti ini sempurna. Banyak orang juga menyatakan itu lebih cepat, tetapi saya menemukan itu hanya sedikit.
sumber
foreach
pernyataan tidak lagi masuk$null
, sehingga kesalahan yang dijelaskan oleh OP tidak lagi terjadi. Lihat bagian "Pernyataan ForEach tidak mengulangi lebih dari $ nol" di posting Blog Powershell Fitur Bahasa V3 Baru .Saya telah mengembangkan solusi dengan menjalankan query dua kali, sekali untuk mendapatkan file dan sekali untuk menghitung file dengan casting get-ChilItem untuk mengembalikan array (casting $ backup sebagai array setelah fakta tampaknya tidak berfungsi) .
Setidaknya itu berfungsi seperti yang diharapkan (kinerja tidak boleh sebagai masalah karena tidak akan pernah ada lebih dari selusin file), jika ada yang tahu tentang solusi permintaan tunggal, silakan posting itu.
sumber
Gunakan yang berikut untuk mengevaluasi apakah array memiliki konten:
Jika variabel tidak ada, Powershell hanya akan mengevaluasinya sebagai false, jadi tidak perlu memeriksa apakah itu ada.
sumber