Тестирование PowerShell, если файл находится в папке Ошибка - PullRequest
0 голосов
/ 06 октября 2018

У меня есть код PowerShell, в котором я хочу проверить, есть ли в папке файл, содержащий определенный шаблон.

Если есть файл с определенным шаблоном, то я хочу продолжить работу.

У меня это так:

$path = "c:\test\"
$Pattern = "1044"
$1044 = Get-ChildItem $Path | Where {$_.Name -match $Pattern}
$strFileName = "C:\test\" + $1044

if (Test-Path $strFileName) {
    ...
}

Проблема в том, что код продолжает работать, хотя файла с шаблоном там нет.

Я напечатал $1044 и там написано

Не могу найти файл

Я также распечатал условие if и там написано:

Не могу найти файлВерно

Вот почему код работает, но я действительно не понимаю, почему.

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Если ваш образец не сложен, вы можете использовать test-path с подстановочным знаком, необязательно использовать get-childitem

$Path="C:\test\*"
$Patern="*1044*"

if (Test-Path -Path $Path -Filter $Patern -PathType Leaf)
{
    "File whith patern exist"
}
0 голосов
/ 06 октября 2018

Оператор $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, если это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...