Test-Path fails to return $True on a file that exists
Solution 1
Try using the -LiteralPath parameter:
Test-Path -LiteralPath 'C:\[My Folder]'
Square brackets have special meaning.
It's actually a POSIX feature so you can do this:
dir [a-f]*
This will give you all things in current directory that start with letter A through F. Bash has the same feature.
Solution 2
There are at least three ways to get it to work.
Using something similar to your approach, you need to add 2 backticks when using double-quotes since a single backtick will be evaluated as an escape character before being sent to the Replace
method.
$a = "c:\test\[R] 10005404, Failed with Comments, [S] SiteName.txt"
$a = $a.Replace("[", "``[")
$a = $a.Replace("]", "``]")
$Result = Test-Path $a
Using single quotes in the Replace
method will also prevent the backticks from being removed.
$a = "c:\test\[R] 10005404, Failed with Comments, [S] SiteName.txt"
$a = $a.Replace('[', '`[')
$a = $a.Replace(']', '`]')
$Result = Test-Path $a
Finally, you could use the LiteralPath
parameter which does not use wildcards (the square brackets are used by PowerShell matches to define a set of characters that can be matched).
$a = "c:\test\[R] 10005404, Failed with Comments, [S] SiteName.txt"
$Result = Test-Path -LiteralPath $a
Admin
Updated on June 20, 2022Comments
-
Admin almost 2 years
I am trying to validate the existence of a file but the problem is that the file name has brackets in the name i.e. c:\test[R] 10005404, Failed with Comments, [S] SiteName.txt.
I have tried using the string .replace method with no success.
$a = c:\test\[R] 10005404, Failed with Comments, [S] SiteName.txt $Result = (Test-Path $a) # Returns $False even though the file exists.
Tried
$a = $a.Replace("[", "`[") $a = $a.Replace("]", "`]") $Result = (Test-Path $a) # Also returns $False even though the file exists.
Ideas would be greatly appreciated. Thanks, ChrisM
-
user66001 about 6 years+1 First two are ideal solutions when needing to use wildcards like
*.txt
alongside files or folders with[
or]
in their names