Với Powershell 3, foreachcâu lệnh không lặp lại $nullvà 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 2xem 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 $backupskhông $null. Một đơn giản Ifxung 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 $backupsnhư 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-ChildItemlệ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
}