Với Powershell 3, foreach
câu lệnh không lặp lại $null
và vấn đề được mô tả bởi OP không còn xảy ra nữa.
Từ bài viết trên Windows PowerShell Blog Các tính năng ngôn ngữ V3 mới :
Câu lệnh ForEach không lặp lại trên $ null
Trong PowerShell V2.0, mọi người thường ngạc nhiên bởi:
PS> foreach ($i in $null) { 'got here' }
got here
Tình huống này thường xảy ra khi một lệnh ghép ngắn không trả về bất kỳ đối tượng nào. Trong PowerShell V3.0, bạn không cần thêm câu lệnh if để tránh lặp lại trên $ null. Chúng tôi chăm sóc điều đó cho bạn.
Đối với PowerShell, $PSVersionTable.PSVersion.Major -le 2
xem phần sau đây để biết câu trả lời gốc.
Bạn có hai lựa chọn, tôi chủ yếu sử dụng thứ hai.
Kiểm tra $backups
không $null
. Một đơn giản If
xung quanh vòng lặp có thể kiểm tra không$null
if ( $backups -ne $null ) {
foreach ($file in $backups) {
Remove-Item $file.FullName;
}
}
Hoặc là
Khởi tạo $backups
như một mảng null. Điều này tránh sự mơ hồ về vấn đề "lặp lại mảng trống" mà bạn đã hỏi trong câu hỏi cuối cùng .
$backups = @()
# $backups is now a null value array
foreach ( $file in $backups ) {
# this is not reached.
Remove-Item $file.FullName
}
Xin lỗi, tôi đã bỏ qua việc cung cấp một ví dụ tích hợp mã của bạn. Lưu ý Get-ChildItem
lệnh ghép được bọc trong mảng. Điều này cũng sẽ làm việc với các chức năng có thể trả về a $null
.
$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
}