Как можно протестировать Get-ChildItem на отсутствие результатов (ноль файлов)? - PullRequest
27 голосов
/ 28 июля 2011

Здесь я нахожусь в тупике из-за простой проблемы;так что извините за всякую головокружение здесь.

У меня есть скрипт, который очищает несуществующие резервные файлы.После определения файлов я зацикливаюсь и распечатываю то, что сбрасывается.Моя проблема возникает при попытке предоставить обратную связь / тестирование при наличии нулевых несуществующих файлов.Сценарий выглядит как ...

$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 без результатов?

Ответы [ 5 ]

48 голосов
/ 28 июля 2011

Попробуйте обернуть в @(..). Он всегда создает массив:

$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 {
  ..
}
13 голосов
/ 28 июля 2011

Когда нет файлов, $ Files равен $ null, так что EBGreen предлагает вам проверить на $ null.Кроме того, $ Files.Count полезен только тогда, когда результатом является коллекция файлов.Если результатом является скаляр (один объект), у него не будет свойства count, и сравнение не удастся.

Совет по производительности: когда вам нужно искать только один тип расширения, используйте параметр -Filter (вместо -Include) для фильтрации на уровне провайдера.

7 голосов
/ 28 июля 2011

Переменная оценивается как нулевое выражение, когда отсканированная папка пуста.Вы можете использовать:

if (!$Files) {
# ...
}
4 голосов
/ 28 июля 2011

Попробуйте также проверить $ files -eq $ null.

0 голосов
/ 21 февраля 2018

Указание типа [bool] перед командой get-childitem вернет True, если что-то найдено, или false, если ничего не найдено. Это то, что делает ответ Эмилиано, но без отрицательного требования. Вы можете заставить любой работать, но я предпочитаю [bool] с некоторыми из более сложных условных операторов, чтобы было легче следовать.

[bool](Get-ChildItem C:\foo.txt)

Используется в операторе If

if ([bool](Get-ChildItem C:\foo.txt)) {write-output "foo.txt exists"}
...