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解析モードについて」を参照してください。
更新4/4/2012:この状況は、PowerShell V3での処理がはるかに容易になります。詳細については、このブログ投稿を参照してください。