PowerShell でスペースと引用符を含むパラメータを使用して EXE ファイルを実行する方法 質問する

PowerShell でスペースと引用符を含むパラメータを使用して EXE ファイルを実行する方法 質問する

PowerShell で次のコマンドを実行するにはどうすればよいですか?

C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -verb:sync -source:dbfullsql="データ ソース=mysource;統合セキュリティ=false;ユーザー ID=sa;パスワード=sapass!;データベース=mydb;" -dest:dbfullsql="データ ソース=.\mydestsource;統合セキュリティ=false;ユーザー ID=sa;パスワード=sapass!;データベース=mydb;",コンピューター名=10.10.10.10,ユーザー名=administrator,パスワード=adminpass"

ベストアンサー1

PowerShell は、文字列で始まるコマンドを見つけると、その文字列を評価するだけです。つまり、通常は次のように画面にエコーします。

PS> "Hello World"
Hello World

PowerShell で文字列をコマンド名として解釈する場合は、次のように呼び出し演算子 (&) を使用します。

PS> & 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe'

その後は、スペースや引用符を含むパラメータ/引数のペアを引用符で囲むだけで十分でしょう。このような複雑なコマンドライン引数を持つEXEファイルを呼び出す場合、PowerShellがEXEファイルに引数を送信する方法を示すツールがあると非常に便利です。PowerShell コミュニティ拡張機能そのようなツールがあります。 echoargs と呼ばれます。 EXE ファイルを echoargs に置き換えるだけで、引数はすべてそのまま残しておけば、EXE ファイルがどのように引数を受け取るかが表示されます。例:

PS> echoargs -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data>
Arg 2 is <Source=mysource;Integrated>
Arg 3 is <Security=false;User>
Arg 4 is <ID=sa;Pwd=sapass!;Database=mydb;>
Arg 5 is <-dest:dbfullsql=Data>
Arg 6 is <Source=.\mydestsource;Integrated>
Arg 7 is <Security=false;User>
Arg 8 is <ID=sa;Pwd=sapass!;Database=mydb; computername=10.10.10.10 username=administrator password=adminpass>

echoargs を使用すると、正しく動作するまで実験することができます。例:

PS> echoargs -verb:sync "-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;"
Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;>

以前は、接続文字列を囲む二重引用符を維持することに力を入れすぎていたことが判明しました。どうやら、cmd.exe でも二重引用符が削除されるため、これは必要ないようです。

ところで、PowerShell チームには脱帽です。彼らは、内部の二重引用符をそのままにしておく必要があった場合、希望する結果を得るために一重引用符と二重引用符の具体的な使い方を教えてくれて、とても助かりました。:-) 彼らは、これが悩みの種であることも認識していますが、特定の問題に影響を受ける人の数によって動かされています。これがあなたにとって悩みの種である場合は、ぜひこの投稿に投票してください。PowerShell バグ報告

PowerShellの解析方法の詳細については、私の効果的な PowerShell ブログ シリーズ- 具体的には項目 10 - 「PowerShell 解析モードの理解」

2012年4月4日更新: PowerShell V3ではこの状況ははるかに扱いやすくなります。こちらをご覧ください。詳細はブログ投稿をご覧ください

おすすめ記事