Как можно проверить Get-ChildItem без каких-либо результатов (нулевые файлы)?
Я нахожусь здесь в тупике, что кажется простой проблемой; так что извините за любую кость-голова здесь.
У меня есть script, который очищает неиспользуемые файлы резервных копий. После идентификации файлов я перебираю и распечатываю то, что сбрасывается. Моя проблема возникает, пытаясь обеспечить обратную связь/тестирование, когда есть нулевые несуществующие файлы. script выглядит как...
$Files = Get-ChildItem $BackupPath_Root -include *.bak -recurse
| where {$_.CreationTime -le $DelDate_Backup }
if ( $Files -eq "" -or $Files.Count -eq 0 ) {
write-host " no files to delete." #<-- this doesn't print when no files
} else {
foreach ($File in $Files) {
write-host "$File"
Remove-Item $File | out-null
}
}
Если проверка файлов отсутствует, это не означает отсутствие условия файла. Каков подходящий способ тестирования $Files
без каких-либо результатов?
Ответы
Ответ 1
Попробуйте обернуть в @(..)
. Он всегда создает массив:
$Files = @(Get-ChildItem $BackupPath_Root -include *.bak -recurse
| where {$_.CreationTime -le $DelDate_Backup })
if ($Files.length -eq 0) {
write-host " no files to delete."
} else {
..
}
Ответ 2
Если файлов нет, $Files равно $null, так как EBGreen предлагает вам протестировать против $null. Кроме того, $Files.Count полезен только тогда, когда результатом является коллекция файлов. Если результатом является скаляр (один объект), он не будет иметь свойство count, и сравнение не будет выполнено.
Совет по производительности: когда вам нужно искать только один тип расширения, используйте параметр -Filter (вместо -Include), поскольку он фильтрует на уровне провайдера.
Ответ 3
Переменная вычисляется до нулевого значения, когда отсканированная папка пуста. Вы можете использовать:
if (!$Files) {
# ...
}
Ответ 4
Пробуйте также тестировать $files -eq $null.