在PowerShell和cmd中转义空格

8
我有一个 PowerShell 脚本,正在通过命令行调用一个 .exe 来创建一个 XML 文件,然后 PowerShell 脚本正在读取该文件。
问题在于,如果我在文件路径中有空格,我需要将其用双引号括起来才能将其传递给命令行。但是当我这样做时,PowerShell 命令会尝试将双引号作为文件路径的一部分读取。有没有一种方法可以转义空格,既可以传递给命令行,又可以在 PowerShell 内部使用命令?
显然,必须从一个命令中去除双引号,而在另一个命令中保留它们,这似乎很愚蠢。
问题出在 Get-Content 行,它无法识别双引号。
$outputpath = '"C:\Users\bob\Desktop\output new.xml"'
Start -FilePath $sqlpackage -ArgumentList "/action:DeployReport /SourceFile:$dacpacpath /Profile:$profilepath /OutputPath:$outputpath" -NoNewWindow -Wait

[xml]$xmldocument = Get-Content -Path $outputpath
2个回答

8

Deadly-Bagel几乎做到了。我认为,不要在 $outputpath 中使用双引号,以使 Get-Content 正常运行,但要在参数列表字符串中添加它们。

请务必使用反引号进行转义。实际上,您可能只是想对所有路径都这样做:

$outputpath = 'C:\Users\bob\Desktop\output new.xml'
Start -FilePath $sqlpackage -ArgumentList "/action:DeployReport /SourceFile:`"$dacpacpath`" /Profile:`"$profilepath`" /OutputPath:`"$outputpath`"" -NoNewWindow -Wait

[xml]$xmldocument = Get-Content -Path $outputpath

在双引号内使用单引号可能更容易。此时无需转义。/SourceFile:'$dacpacpath' - Matt
2
@Matt 只有当 $sqlpackage 程序接受单引号作为有效的引号字符时,它才能正常工作。 - user4003407
在ArgumentList中添加双引号并对其进行转义可以正常工作。@Matt,单引号无法正常工作。 - ryanw55
直说吧,PowerShell 真的很糟糕。 - Rei Miyasaka

1

-ArgumentList 接受 String[],因此请尝试以下操作:

$outputpath = "C:\Users\bob\Desktop\output new.xml"

Start -FilePath $sqlpackage -ArgumentList @("/action:DeployReport", "/SourceFile:$dacpacpath", "/Profile:$profilepath", "/OutputPath:$outputpath") -NoNewWindow -Wait

我猜测将所有内容作为一个参数传递会导致混淆。

抱歉,问题在下一行,因为Get-Content不喜欢双引号。 - ryanw55
啊,非常抱歉,我没有仔细阅读问题 ^^ - Deadly-Bagel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接