次のコマンドラインで-param
値の引用符を適切にエスケープするにはどうすればよいですか?
$cmd="\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'""
Invoke-Expression $cmd
もちろんこれは失敗します。エスケープ文字 `を使用して引用符(単一および二重)をエスケープしようとし、さまざまな組み合わせを行いましたが、何も機能しません。
そのようなパラメータをエスケープすることは、通常フラストレーションの原因であり、時間の浪費のように感じます。あなたは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'"
...(同じ仮定で)正常に動作するはずです。
バックティック( `)を使用すると、次の場所に配置するとうまくいきます。
$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'""
'@
上記のように、開始記号と終了記号はそれぞれの行になければなりません。
Node.jsモジュールを介してコマンドを実行しようとしたときに、今日同様の苦境に陥りました。
PowerShellを使用して実行しようとしていました。
command -e 'func($a)'
しかし、余分な記号を使用して、PowerShellは引数を処理していました。修正するために、エスケープされた二重引用符を逆ティックします。
command -e `"func($a)`"