我试图编写一个脚本来测试文件路径的可用性。其中一个过程是用户必须输入文件路径或只是将文件拖到Powershell命令提示符中。
在这个过程中, 用户将输入文件路径,如 C:\ Program Files \ 7-Zip \ 7z.exe ,该字符串将成为 $ filePath 变量的值,该变量将用作Test-Path命令的参数。
但有时,用户只需将文件拖到Powershell命令提示符中,这样字符串就会包含一对引号,就像图片1一样。 (“C:\ Program Files \ 7-Zip \ 7z.exe”) Picture 1
然后你会看到当我尝试使用带有$ filePath变量的Test-Path命令测试路径时,$ filePath的值(字符串)包含一对引号,结果即使路径存在且有效,也将始终为False。 但是当我使用相同的Test-Path命令而不使用变量时(我的意思是将文件路径复制并粘贴到命令中),它可以正常工作。
IT WEIRD!
我尝试通过键盘将文件路径键入变量,而不是将文件拖到Powershell命令提示符中。 (没有引号) 然后使用相同的方法测试文件路径(使用文件路径的变量)。它工作正常。
我不明白。他们不是一回事吗?
当
$filePath = "C:\Program Files\7-Zip\7z.exe"
低于2个命令应该有相同的结果!为什么他们不是?
Test-Path -Path $filePath
Test-Path -Path "C:\Program Files\7-Zip\7z.exe"
答案 0 :(得分:2)
在拖放的情况下,看起来如果路径没有空格,它将返回true。如果它有空格,那么PowerShell会在其周围放置引号。在这种情况下,PowerShell实际上将路径视为"C:\Program Files\7-Zip\7z.exe"
你可以做的就是像这样使用-replace
运算符 -
Test-Path -path ($filepath -replace '"', "") -PathType Leaf
或强>
正如@Josefz在评论中所建议的那样,你也可以使用Trim()
方法,如 -
Test-Path -path ($filepath.Trim('"')) -PathType Leaf
不完全是对您的问题的解释,但您可以将其用作解决方法。
答案 1 :(得分:1)
如果用户输入包含嵌入式"
字符的文件名,则Test-Path
将返回$false
。为什么?文件名不能包含"
个字符;解析器使用"
字符来指示字符串中的参数包含空格。所以这当然会返回$false
:
$filePath = '"C:\Program Files\7-Zip\7z.exe"'
Test-Path $filePath
嵌入的"
字符不是文件名的一部分;您需要省略它们,结果为$true
。
答案 2 :(得分:0)
您使用的是哪个版本的powershell?我得到两个命令true
PS C:\Users> $filePath = "C:\Program Files\7-Zip\7z.exe"
PS C:\Users> Test-Path -Path $filePath
True
PS C:\Users> Test-Path -Path "C:\Program Files\7-Zip\7z.exe"
True
PS C:\Users> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
5 1 17134 48
编辑----------
知道了,问题是Read-Host将使用引号直接保存字符串。简单的解决方案是删除引号
PS C:\Users> $filePath = Read-Host -Prompt "enter input"
enter input: "C:\Program Files\7-Zip\7z.exe"
PS C:\Users> $filePath
"C:\Program Files\7-Zip\7z.exe"
PS C:\Users> Test-Path -Path $filePath
False
PS C:\Users> Test-Path -Path $filePath.replace("`"","")
True