web-dev-qa-db-ja.com

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

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

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

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

74
eetawil

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

長い話:ストリングを@ '...' @でラップするだけです:

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

(Iassumedどの引用符が必要であり、どのものをエスケープしようとしていたかを忘れないでください。)出力を処理したい場合は、 -NoNewWindowスイッチを追加します。

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

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

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

50
BartekB

バックティック( `)を使用すると、次の場所に配置するとうまくいきます。

$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'に言及したエラーを返しました。

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

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

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

77
Owen B

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

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

command -e 'func($a)'

しかし、余分な記号を使用して、PowerShellは引数を処理していました。修正するために、エスケープされた二重引用符を逆ティックします。

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