Оператор $1044 = Get-ChildItem $Path | Where {$_.Name -match $Pattern}
может возвращать любое количество результатов (ноль, один или более).
Если он возвращает ноль результатов, переменная $1044
будет пустой, поэтому $strFileName = "C:\test\" + $1044
оценивается какпросто C:\test\
, который Test-Path
(правильно) сообщит как существующий.
Если он вернет более одного результата, переменная $1044
будет содержать список объектов файла или папки.Выполнение $strFileName = "C:\test\" + $1044
превратит этот список в разделенную пробелами строку имен файлов / папок и добавит ее к базовому пути (то есть вы получите что-то вроде C:\test\1044foo bar1044 1044_baz
вместо C:\test\1044foo
, C:\test\bar1044
, C:\test\1044_baz
).Этот путь не существует, поэтому Test-Path
всегда будет иметь значение false в этой ситуации.
Кроме того, вам не нужно сначала строить $strFileName
путем конкатенации строк (если только не ваш базовый путь).отличается от пути, используемого в Get-ChildItem
), поскольку объекты, возвращаемые Get-ChildItem
, уже имеют свойство с полным путем (FullName
).И вам также не нужно проверять пути на существование, потому что Get-ChildItem
не вернул бы элемент, если бы он не существовал.
Измените ваш код на что-то вроде этого:
$1044 = Get-ChildItem $Path | Where-Object {$_.Name -match $Pattern}
if ($1044) {
...
}
и он должен делать то, что вы ожидаете, потому что PowerShell оценивает $1044
до $false
, если он пуст, и $true
, если это не так.