В Powershell 3 foreach
оператор не повторяется, $null
и проблема, описанная OP, больше не возникает.
Из сообщения блога Windows PowerShell. Новые возможности языка V3 :
Инструкция ForEach не выполняет итерацию по $ null
В PowerShell V2.0 люди часто удивлялись:
PS> foreach ($i in $null) { 'got here' }
got here
Такая ситуация часто возникает, когда командлет не возвращает никаких объектов. В PowerShell V3.0 вам не нужно добавлять оператор if, чтобы избежать итерации по $ null. Мы позаботимся об этом для вас.
Для PowerShell $PSVersionTable.PSVersion.Major -le 2
см. Следующее для оригинального ответа.
У вас есть два варианта, я в основном использую второй.
Проверьте $backups
нет $null
. Простой If
цикл может проверить не$null
if ( $backups -ne $null ) {
foreach ($file in $backups) {
Remove-Item $file.FullName;
}
}
Или
Инициализировать $backups
как пустой массив. Это позволяет избежать неоднозначности проблемы «повторяющихся пустых массивов», о которой вы спрашивали в своем последнем вопросе .
$backups = @()
# $backups is now a null value array
foreach ( $file in $backups ) {
# this is not reached.
Remove-Item $file.FullName
}
Извините, я не предоставил пример интеграции вашего кода. Обратите внимание на Get-ChildItem
командлет, заключенный в массив. Это также будет работать с функциями, которые могут возвращать $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
}