带引号的Powershell文件路径

时间:2018-05-25 07:04:00

标签: powershell

我试图编写一个脚本来测试文件路径的可用性。其中一个过程是用户必须输入文件路径或只是将文件拖到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命令提示符中。 (没有引号) 然后使用相同的方法测试文件路径(使用文件路径的变量)。它工作正常。

Picture 2

我不明白。他们不是一回事吗?

$filePath = "C:\Program Files\7-Zip\7z.exe"

低于2个命令应该有相同的结果!为什么他们不是?

Test-Path -Path $filePath
Test-Path -Path "C:\Program Files\7-Zip\7z.exe"

3 个答案:

答案 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