2009-05-15 5 views
24

これをPowerShell v1.0でテストしました。設定は次のとおりです。&演算子を使用してPowerShellからMSBuildを呼び出す方法は?

Id CommandLine 
-- ----------- 
    1 $msbuild = "C:\Windows\Microsoft.NET\Framework\v3.5\msbuild.exe" 
    4 $a = "C:\some\project\or\other\src\Solution.sln /target:Clean /target:Build" 

です。

Id CommandLine 
-- ----------- 
    5 & $msbuild $a 

この行は、直感的エラーメッセージで失敗します。

&はコマンド自体であるため、この行は失敗します。

Id CommandLine 
-- ----------- 
10 & "$msbuild $a" 

この行は動作します:

Id CommandLine 
-- ----------- 
16 cmd /c "$msbuild $a" 

説明してください。私はなぜ&の構文がMSBuild特有の回避策よりも機能しないのかに興味があります。

+0

MSBuildを直接呼び出すのではなく、[Invoke-MSBuild](http://sedodream.com/2014/07/19/IntroducingPSBuildAnImprovedInterfaceForMsbuildexeInPowerShell.aspx)などのヘルパーコマンドレットを使用することをお勧めします。 – orad

答えて

26

表示されている問題は、PowerShellの解析引数の結果です。最初の例では、PowerShellは$ aを見ると、それを単一のパラメータmsbuildとして渡します。これは、PSCXのechoargsユーティリティを使って見ることができます:。

PS> $a = "C:\some\project\or\other\src\Solution.sln /target:Clean /target:Build" 
PS> & echoargs $a 
Arg 0 is <C:\some\project\or\other\src\Solution.sln /target:Clean /target:Build> 

コマンド名として「$ echoargs $ A」を呼び出すためにPowerShellを言っているし、それが有効なコマンド名ではないため、2番目の例では、さらに悪くなります。

CMD.EXEがパースされ、実行される1つの引数として「$ echoargs $ A」の拡張形式を取得しますので、三行目は動作します:

あなたがここにオプションのカップルを持っています。私は、任意の一部ならば、特に起動-式と非常に慎重になろうとし、一般的に

PS> Invoke-Expression "$msbuild $a" 

PS> & $msbuild C:\some\project\or\other\src\Solution.sln ` 
    /target:Clean /target:Build 

他の選択肢はそうのような起動式を使用することです:まず私は、このようにそれを行います呼び出される文字列はユーザ​​ーによって提供されます。

28

$collectionOfArgs = @("C:\some\project\or\other\src\Solution.sln", 
    "/target:Clean", "/target:Build") 
& $msbuild $collectionOfArgs 

これは動作します。 &は引数のコレクションをとるので、複数の引数を含む文字列を文字列引数の集合に分割する必要があります。

+0

素晴らしい...ロギングによる議論のログリストで私のために働いた。 –

+0

すばらしい解決策! @ keith-hillによって提供される説明に加えて、これは完璧な意味を持ちます。 – simonlchilds

+0

#私はk1ll1ingされました。 – granadaCoder

2

無料Invoke-MsBuild powershell script/moduleを試すこともできます。これにより、msbuild.exeを手動で呼び出すのではなく、呼び出すことができるInvoke-MsBuild PowerShellコマンドレットが提供されます。

関連する問題