Test-Path无法在存在的文件上返回$ True

时间:2012-04-13 17:50:26

标签: powershell powershell-v2.0 powershell-ise

我正在尝试验证文件是否存在,但问题是文件名在名称中有括号,即c:\ test [R] 10005404,注释失败,[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 个答案:

答案 0 :(得分:22)

尝试使用-LiteralPath参数:

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

方括号具有特殊含义。

它实际上是一个POSIX功能,所以你可以这样做:

dir [a-f]*

这将为您提供当前目录中以字母A到F开头的所有内容.Bash具有相同的功能。

答案 1 :(得分:5)

至少有三种方法可以让它发挥作用。

使用类似于你的方法的东西,你需要在使用双引号时添加2个反引号,因为在发送到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