Назад | Перейти на главную страницу

Powershell входит в цикл foreach с нулевым объектом

Я перечисляю все резервные копии в данном каталоге:

$backups = Get-ChildItem -Path $zipFilepath | 
Where-Object {($_.lastwritetime -lt (Get-Date).addDays(-7)) -and 
(-not $_.PSIsContainer) -and ($_.Name -like "backup*")}

Если я установил намеренно не возвращать файлы (.addDays (-600), то следующий вывод будет «Пусто» (как и ожидалось):

if (!$backups)
{
    "Empty"
}

Если я попытаюсь перечислить имена с пустой переменной $ backups:

foreach ($file in $backups)
{
    $file.FullName;
}

Я ничего не получу (как и ожидалось), если я изменю это на:

"test"+ $file.FullName;

тогда я получаю единственный «тест» под «Пустым». Как это возможно, если $ backups пуст?

Это «особенность» Powershell. Ваш $backups может содержать множественный $null значения, а также ненулевые, поэтому Powershell должен выполнить итерацию объекта для обработки foreach. Тот факт, что мы оба видим $backup как однозначный скаляр ($null в данном случае) не имеет значения, по крайней мере, для MS ... :)

Посмотри это Отчет об ошибке Microsoft Connect подробнее - Это "исправлено" в Powershell v3.

В версии 2:

PS H:\> foreach ( $i in $null ) { "Hi" }
Hi

В версии 3:

PS H:\> foreach ( $i in $null ) { "Hi" }

(Нет вывода)