带引号的Powershell文件路径问题

带引号的Powershell文件路径问题,powershell,Powershell,我试图编写一个脚本来测试文件路径的可用性。其中一个过程是用户必须输入文件路径,或者只是将文件拖到Powershell命令提示符中 在这个过程中,, 用户将输入文件路径,如C:\Program Files\7-Zip\7z.exe,字符串将成为$filePath变量的值,该变量将用作测试路径命令的参数 但有时,用户只需将文件拖到Powershell命令提示符中,这样字符串就会包含一对引号,就像图1一样。 C:\ProgramFiles\7-Zip\7z.exe 然后您将看到,当我尝试使用带有$f

我试图编写一个脚本来测试文件路径的可用性。其中一个过程是用户必须输入文件路径,或者只是将文件拖到Powershell命令提示符中

在这个过程中,, 用户将输入文件路径,如C:\Program Files\7-Zip\7z.exe,字符串将成为$filePath变量的值,该变量将用作测试路径命令的参数

但有时,用户只需将文件拖到Powershell命令提示符中,这样字符串就会包含一对引号,就像图1一样。 C:\ProgramFiles\7-Zip\7z.exe

然后您将看到,当我尝试使用带有$filePath变量的test path命令测试路径时,$filePath的valuestring包含一对引号,即使路径存在且有效,结果也将始终为False。 但是,当我使用相同的测试路径命令而不使用变量时,我的意思是只需将文件路径复制并粘贴到命令中,它就能正常工作

真奇怪

我已尝试通过键盘将文件路径键入变量中,而不是将文件拖动到Powershell命令提示符中。无引号 然后使用相同的方法,使用文件路径变量测试文件路径。它很好用

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

什么时候

$filePath=C:\ProgramFiles\7-Zip\7z.exe

下面两个命令应该有相同的结果!为什么不是呢

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

您正在使用哪个版本的powershell?这两个命令我都能做到

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    
编辑-----

明白了,问题是readhost会用引号按字面意思保存字符串。简单的解决方案是删除引号

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

您正在使用哪个版本的powershell?这两个命令我都能做到

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    
编辑-----

明白了,问题是readhost会用引号按字面意思保存字符串。简单的解决方案是删除引号

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

在拖放的情况下,如果路径没有空格,它将返回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

这不完全是对您的问题的解释,但您可以将其用作解决方法。

在拖放的情况下,如果路径没有空格,它将返回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

这不完全是对您的问题的解释,但您可以将其用作解决方法。

如果用户键入包含嵌入字符的文件名,则测试路径将返回$false。为什么?文件名不能包含该字符;解析器使用该字符指示字符串中的参数包含空格。这当然会返回$false:


嵌入字符不是文件名的一部分;如果用户键入的文件名包含嵌入字符,则测试路径将返回$false。为什么?文件名不能包含该字符;解析器使用该字符指示字符串中的参数包含空格。这当然会返回$false:


嵌入字符不是文件名的一部分;您需要省略它们,结果才是$true。

我认为这种行为是正常的。当一个变量包含某个内容时,您可能会在控制台中写入“某物”而不是完全重复,但与您的问题密切相关:文件名/路径不能包含引号字符。引号用于命令行解析器指定参数,以指示参数包含空格。引号不是参数的一部分。我认为这种行为是正常的。当一个变量包含某个内容时,您可能会在控制台中写入“某物”而不是完全重复,但与您的问题密切相关:文件名/路径不能包含引号字符。引号用于命令行分析器指定参数,以指示参数包含空格。引号不是参数的一部分。他的filepath变量包含C:\Program Files\7-Zip\7z.exe,而不是C:\Program Files\7-Zip\7z.exe。这就像您要编写测试路径“C:”一样,在powershell中这也是错误的5@guiwhatsthat测试路径“C:”不必为false。@PetSerAl当我像测试路径“C:”那样编写命令时,结果将为false。什么时候会是真的?你能解释一下吗?@guiwhats新的PSDrive'C'变量\| Out Null${}='存在';测试路径'C:'是。这是因为读主机!非常感谢。
啊,兄弟!他的文件路径变量包含C:\Program Files\7-Zip\7z.exe,而不是C:\Program Files\7-Zip\7z.exe。这就像您要编写测试路径“C:”一样,在powershell中这也是错误的5@guiwhatsthat测试路径“C:”不必为false。@PetSerAl当我像测试路径“C:”那样编写命令时,结果将为false。什么时候会是真的?你能解释一下吗?@guiwhats新的PSDrive'C'变量\| Out Null${}='存在';测试路径'C:'是。这是因为读主机!谢谢你,兄弟!请尝试$filePath。修剪“”而不是-replace@JosefZ-也可以,但有什么具体原因吗?如果路径没有空格,它将返回true-不完全是。问题在于字符,而不是空格。是的,问题在于,当用户拖放到PowerShell控制台的路径时,如果文件路径包含spacese.g,问题就会出现。C:\Program文件,然后自动放置双引号。OP正在谈论一个类似的问题,当他拖放到豪华控制台时。这就是我的意思。编辑答案以使其更有意义。正确-使用拖放时会添加引号,因为假定文件名将在命令行上使用,并且需要作为单个参数进行分析。字符不是文件名的一部分。请尝试使用$filePath.Trim“”而不是-replace@JosefZ-也可以,但有什么具体原因吗?如果路径没有空格,它将返回true-不完全是。问题在于字符,而不是空格。是的,问题在于,当用户拖放到PowerShell控制台的路径时,如果文件路径包含spacese.g,问题就会出现。C:\Program文件,然后自动放置双引号。OP正在谈论一个类似的问题,当他拖放到豪华控制台时。这就是我的意思。编辑答案以使其更有意义。正确-使用拖放时会添加引号,因为假定文件名将在命令行上使用,并且需要作为单个参数进行分析。这些字符不是文件名的一部分。是!当我使用Read-Host cmdlet时,它会将我输入的所有内容保存为包含引号的字符串。我所需要做的就是使用像@Vivek Kumar Singh Saidings这样的修剪方法删除引号!当我使用Read-Host cmdlet时,它会将我输入的所有内容保存为包含引号的字符串。我所需要做的就是用Trim方法去掉引号,就像@vivekkumarsingh说的那样