2012-04-13 3 views
8

Я пытаюсь проверить существование файла, но проблема в том, что имя файла имеет скобки в имени, то есть c: \ test [R] 10005404, Failed с комментариями, [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. 

Идеи было бы весьма признателен. Спасибо, Мироваренная

+0

Там должны быть кавычки имя пути: '$ а =«C: \ Test \ [R] 10005404, Failed с комментариями, [S] SiteName.txt''. Это просто опечатка, или это в вашем коде? – Rynant

+0

Старая Windows [подсказка PowerShell недели] (http://technet.microsoft.com/en-us/library/ff730956.aspx) объяснила, почему и обходные пути. Это своего рода дублированный вопрос из [powershell get-childitem не может обрабатывать имя файла, начиная с символа с символом escape (http://stackoverflow.com/a/9508802/608772) – JPBlanc

ответ

21

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

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

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

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

dir [a-f]* 

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

5

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

Используя что-то похожее на ваш подход, вам нужно добавить 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 
+0

+1 Первые два являются идеальным решением при необходимости использовать подстановочные знаки, такие как '* .txt', рядом с файлами или папками с' ['или'] 'в своих именах – user66001