2017-03-01 8 views
0

Powershellスクリプトからgpg2を呼び出そうとしています。埋め込み引用符でパラメータを渡す必要がありますが、echoargや実行ファイルの結果を直接見ると、非常に奇妙な動作をします。Powershell:二重引用符が埋め込まれたgpgコマンドパラメータ

$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から得るものです:私は、配列を変換する& gpg2 "$args"をしようとした場合

gpg2.exe : gpg: invalid option "--passphrase "PassphraseWith!$#""

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から実行するかどうか)を与えますこの1上の任意のアイデア

gpg2.exe : gpg: invalid option "--batch --yes --passphrase "PassphraseWith!$#"

:文字列の後、私は次の同様の結果を得ますか?

+0

これですよばかげた答えは、しかし、あなたが実際にあなたのパスワードでのお金の看板を持っている場合、あなたは...単一引用符を使用する必要がCole9350 @ – Cole9350

+0

は私がしても同じ結果を得ます私はpwからシンボルを取り出しますが、1行目の最初の宣言では、$の後に英数字をつけると、一重引用符が必要になります – cmcapellan

+0

$ {argsは自動変数であるため$ args} = " 「-batch」、「--yes」、「--passphrase」、「 '' $ PGPPassphrase' ""、 "-o"、 "" $ DecryptedFile' ""、 "-d"、 "' "$ EncyptedFile ''; echoargs '$ {argsは自動変数ですので、argsではありません}' '' – PetSerAl

答えて

0

PetSerAlのソリューション@:

"--passphrase", "`"$Passphrase`"" 

として組み合わされていない:あなたはフラグ/パラメータとその値をトークン化するので、配列内の2つの要素に出て分割する必要があり

"--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 
+0

@PetSerAlあなたが正しいことを指摘していただきありがとうございます。一定! – cmcapellan

関連する問題