2009-05-15 19 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" 

यह पंक्ति unintuitive त्रुटि संदेश के साथ विफल रहता है:

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

यह लाइन विफल हो जाती है क्योंकि & पहले तर्क को कमांड होने की अपेक्षा करता है।

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

इस लाइन काम करता है:

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

कृपया समझाएं। मुझे अधिक दिलचस्पी है कि & सिंटैक्स एमएसबिल्ड-विशिष्ट वर्कअराउंड की तुलना में क्यों काम नहीं कर रहा है।

+0

मैं एमएसबिल्ड को सीधे कॉल करने के बजाय ['Invoke-MSBuild'] (http://sedodream.com/2014/07/19/IntroducingPSBuildAnImprovedInterfaceForMsbuildexeInPowerShell.aspx) के रूप में एक सहायक cmdlet का उपयोग करने का सुझाव देता हूं। – orad

उत्तर

26

जो समस्याएं आप पावरशेल पार्सिंग तर्क से परिणाम देख रहे हैं। पहले उदाहरण में, जब PowerShell $ देखता है तो यह इसे एक पैरामीटर 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 डॉलर प्रति" कमांड नाम के रूप में और यह एक वैध आदेश का नाम नहीं है। क्योंकि 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

ग्रेट सॉल्यूशन! @ केथ-हिल द्वारा प्रदान की गई स्पष्टीकरण के साथ यह सही अर्थ बनाता है। – simonlchilds

+0

#blessYou यह मुझे k1ll1ing था। – granadaCoder

2

आप मुफ्त Invoke-MsBuild powershell script/module का उपयोग करने का भी प्रयास कर सकते हैं। यह अनिवार्य रूप से आपको एक Invoke-MsBuild PowerShell cmdlet देता है जिसे आप msbuild.exe मैन्युअल रूप से स्वयं को आमंत्रित करने का प्रयास करने के बजाय कॉल कर सकते हैं।

संबंधित मुद्दे