Я перечисляю все резервные копии в данном каталоге:
$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" }
(Нет вывода)