Подтвердить что ты не робот

Как можно проверить 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 без каких-либо результатов?

4b9b3361

Ответ 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.