引用符と二重引用符のエスケープ


93

-param次のコマンドラインで値の引用符を適切にエスケープするにはどうすればよいですか?

$cmd="\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'""
Invoke-Expression $cmd 

もちろんこれは失敗します。エスケープ文字 `を使用して引用符(シングルおよびダブル)をエスケープしようとし、さまざまな組み合わせを行いましたが、何も機能しません。



@PeterMortensenこの記事の問題は、ネイティブアプリケーションを起動し、引数として二重引用符を含むパラメーターを渡したい場合に、より良い方法がないように見えることです
Andrew Savinykh

@Andrew Savinykh:1つの方法は、代わりにcmdから起動することです$someCommandStringWithDoubleQuotes | cmd。これは実際にはPowerShellスクリプトから機能します(たとえば、CMakeの呼び出し(二重引用符が必要です(それ以外の場合は黙って失敗します)))。CMDの代わりはbash.exe(MinGW)ですが、状況によっては起動が非常に遅くなる場合があります。
Peter Mortensen

回答:


59

このようなパラメータをエスケープすると、通常はフラストレーションの原因となり、時間の浪費のように感じます。あなたがv2を使用しているので、Joel "Jaykul" Bennet が少し前にブログに書いたテクニックを使用することをお勧めします。

要するに、文字列を@ '...' @で囲むだけです。

Start-Process \\server\toto.exe @'
-batch=B -param="sort1;parmtxt='Security ID=1234'"
'@

(必要な引用符とエスケープしようとしたものを想定していることに注意してください。)出力を操作する場合は、-NoNewWindowスイッチを追加することをお勧めします。

ところで、これは非常に重要な問題だったので、v3以降--%、PowerShellパーサーがパラメーターを使用して何も実行しないようにすることができます。

\\server\toto.exe --% -batch=b -param="sort1;paramtxt='Security ID=1234'"

...(同じ前提で)正常に動作するはずです。


答えてくれてありがとう。start-processは、どのように試しても常に文句を言いました。私はcmd / C $ cmdを実行しました($ cmdは.exeを含む私のコマンド全体です)。私はpowershell 2.0を使用しています。私が正しく覚えていれば、ヒアストリングでさえ機能しませんでした。
eetawil 2013

3
これは、バッククォート( `)を使用して二重引用符をエスケープする場合と比較して、不必要に複雑に思えます。
2014

6
期待するルールに従っている限り、これはうまく機能します。最初の@は「行1」にあり、パラメータは「行2」にあり、最後の「@」は「行3」にある必要があります。末尾の「@」の前にスペースを含めることはできません。この構文はうるさいですね。
イアンニューランド2015

よく働く!文字列の変数を展開する必要がある場合は@""@代わりにand を使用できます。
眉毛

95

バックティック( `)を使用すると、次の場所に置くと問題なく動作します。

$cmd="\\server\toto.exe -batch=B -param=`"sort1;parmtxt='Security ID=1234'`""

$cmd として返されます:

\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'"

それがあなたが探していたものですか?

PowerShellが予期しないトークン 'sort1'を参照してくれたというエラーがあり、それが私がバッククォートを置く場所を決定した方法です。

@ '...' @構文は「ヒア文字列」と呼ばれ、入力した内容を正確に返します。これらを使用して、次の方法で変数を設定することもできます。

$cmd=@'
"\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'""
'@

上記のように、開始記号と終了記号はそれぞれの行になければなりません。


遅れて申し訳ありません...私がそれを機能させた方法は、最後にPowershellからcmd / C "MYCOMMAND"を呼び出すことです。powershellを直接使用しても機能しませんでした。
eetawil 2013

1
しかし、それが呼び出さInvoke-Expressionれた$cmdときに二重引用符を取り除きませんか?または、使用$cmdせずにどのように使用しましたInvoke-Expressionか?
Peter Mortensen

8

今日、Node.jsモジュールを介してコマンドを実行しようとしたときに、同様の窮地に陥っていました。

PowerShellを使用して実行しようとしました。

command -e 'func($a)'

しかし、余分なシンボルがあるため、PowerShellは引数を混乱させていました。修正するために、エスケープされた二重引用符をバックティックします。

command -e `"func($a)`"

2
興味深い:"['`"][^'`"]['`"]"動作しますが、'[`'"][^`'"][`'"]'動作しません!私を狂わせていた
David J
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.