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