PowerShell は、文字列で始まるコマンドを検出すると、文字列を評価するだけです。つまり、通常は、次のように画面にエコーします。
PS> "Hello World"
Hello World
PowerShell で文字列をコマンド名として解釈する場合は、次のように呼び出し演算子 (&) を使用します。
PS> & 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe'
その後、スペースや引用文字を含むパラメーター/引数のペアを引用するだけで済みます。複雑なコマンド ライン引数を使用してこのような EXE ファイルを呼び出す場合、通常、PowerShell が引数を EXE ファイルに送信する方法を示すツールがあると非常に役立ちます。PowerShell Community Extensionsには、そのようなツールがあります。これは、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 での処理がはるかに簡単になります。詳細については、このブログ投稿を参照してください。