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)와 같은 도우미 cmdlet을 사용하는 것이 좋습니다. – 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> 

두 번째 예는 호출 PowerShell을 이야기하고 있기 때문에 더욱 심각하다 "$ echoargs을 $ A"명령 이름과 유효한 명령 이름이 아닙니다.

세 번째 줄은 cmd.exe를이의 확장 된 형태 얻을 수 있기 때문에 작동 "$ echoargs $를에"구문 분석하고 실행하는 하나의 인수로 :

당신은 여기에 몇 가지 옵션이있다. 일반적으로

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

#blessYou 이건 저를 괴롭혔습니다. – granadaCoder

2

무료 Invoke-MsBuild powershell script/module을 사용해 볼 수도 있습니다. 이것은 기본적으로 수동으로 msbuild.exe를 호출하는 대신 호출 할 수있는 Invoke-MsBuild PowerShell cmdlet을 제공합니다.

관련 문제