Test-Path не может вернуть $True для файла, который существует

Я пытаюсь проверить существование файла, но проблема в том, что имя файла содержит квадратные скобки в имени, например, c:\test[R] 10005404, Failed with Comments, [S] SiteName.txt.

Я пытался использовать метод строки.replace без успеха.

$a = c:\test\[R] 10005404, Failed with Comments, [S] SiteName.txt
$Result = (Test-Path $a)
# Returns $False even though the file exists.

Пытался

$a = $a.Replace("[", "`[")
$a = $a.Replace("]", "`]")

$Result = (Test-Path $a)
# Also returns $False even though the file exists.

Идеи будут с благодарностью. Спасибо, ChrisM

2 ответа

Попробуйте использовать параметр -LiteralPath:

Test-Path -LiteralPath 'C:\[My Folder]'

Квадратные скобки имеют особое значение.

На самом деле это функция POSIX, так что вы можете сделать это:

dir [a-f]*

Это даст вам все вещи в текущем каталоге, которые начинаются с буквы от A до F. Bash имеет ту же функцию.

Есть как минимум три способа заставить его работать.

Используя что-то похожее на ваш подход, вам нужно добавить 2 обратных знака при использовании двойных кавычек, так как один обратный знак будет оцениваться как escape-символ перед отправкой в Replace метод.

$a = "c:\test\[R] 10005404, Failed with Comments, [S] SiteName.txt"
$a = $a.Replace("[", "``[")
$a = $a.Replace("]", "``]")
$Result = Test-Path $a

Использование одинарных кавычек в Replace Метод также предотвратит удаление обратных галочек.

$a = "c:\test\[R] 10005404, Failed with Comments, [S] SiteName.txt"
$a = $a.Replace('[', '`[')
$a = $a.Replace(']', '`]')
$Result = Test-Path $a

Наконец, вы можете использовать LiteralPath параметр, который не использует подстановочные знаки (квадратные скобки используются совпадениями PowerShell для определения набора символов, которые могут быть сопоставлены).

$a = "c:\test\[R] 10005404, Failed with Comments, [S] SiteName.txt"
$Result = Test-Path -LiteralPath $a
Другие вопросы по тегам