我正在尝试从Powershell脚本调用gpg2。我需要使用嵌入式引号传递参数,但是当我直接查看echoargs或可执行文件的结果时,我会得到一些非常奇怪的行为。
$Passphrase = "PassphraseWith!$#" #don't worry, real passphrase not hardcoded!
$Filename = "\\UNC\path\with\a space\mydoc.pdf.pgp"
$EncyptedFile = $Filename -replace "\\", "/"
$DecryptedFile = $EncyptedFile -replace ".pgp" , ""
$args = "--batch", "--yes", "--passphrase `"`"$PGPPassphrase`"`"", "-o `"`"$DecryptedFile`"`"", "-d `"`"$EncyptedFile`"`""
& echoargs $args
& gpg2 $args
gpg要求我使用双引号作为密码,因为它有符号和路径,因为有空格(当我直接从命令提示符运行示例单个命令时,确认这是有效的)。另外,gpg想要带有正斜杠的UNC路径(确认这也有效)。
正如您所看到的,我正在尝试用成对的转义双引号来包装密码和文件路径,因为echoargs似乎表明外部引号被剥离。这是我从echoargs得到的:
Arg 0 is <--batch>
Arg 1 is <--yes>
Arg 2 is <--passphrase "PassphraseWith!$#">
Arg 3 is <-o "//UNC/path/with/a space/mydoc.pdf">
Arg 4 is <-d "//UNC/path/with/a space/mydoc.pdf.pgp">
Command line:
"C:\Program Files (x86)\PowerShell Community Extensions\Pscx3\PSCX\Apps\EchoArgs.exe" --batch --yes "--pass
phrase ""PassphraseWith!$#""" "-o ""//UNC/path/with/a space/mydoc.pdf""" "-d ""//UNC/path/with/a space/mydo
c.pdf.pgp"""
但是,gpg2给出了以下结果(无论是直接从ISE还是PS运行):
gpg2.exe : gpg: invalid option "--passphrase "PassphraseWith!$#""
如果我尝试& gpg2 "$args"
将数组转换为字符串,那么我会得到以下类似的结果:
gpg2.exe : gpg: invalid option "--batch --yes --passphrase "PassphraseWith!$#"
关于这个的任何想法?
答案 0 :(得分:0)
@ PetSerAl的解决方案:您需要标记标志/参数及其值,因此分成数组中的两个元素:
"--passphrase", "`"$Passphrase`""
未合并为:
"--passphrase `"`"$Passphrase`"`""
请注意,使用反引号的常规Powershell转义引号在这里工作正常。 完整示例如下:
$Passphrase = "PassphraseWith!$#" #don't worry, real passphrase not hardcoded!
$Filename = "\\UNC\path\with\a space\mydoc.pdf.pgp"
$EncyptedFile = $Filename -replace "\\", "/"
$DecryptedFile = $EncyptedFile -replace ".pgp" , ""
$params = "--batch", "--quiet", "--yes", "--passphrase", "`"$Passphrase`"", "-o", "`"$DecryptedFile`"", "-d", "`"$EncyptedFile`""
& echoargs $params
& gpg2 $params