2008-09-16 15 views
5

कोई भी किसी भी अच्छे MSBuild कार्यों के बारे में जानता है जो PowerShell स्क्रिप्ट निष्पादित करेगा और इसे विभिन्न पैरामीटर पास करेगा?कोई भी अच्छा PowerShell MSBuild कार्य?

मैं B# .NET Blog: Invoking PowerShell scripts from MSBuild ढूंढने में सक्षम था, लेकिन मुझे कुछ और उम्मीद है जो थोड़ा और पॉलिश किया गया है।

यदि मुझे कुछ भी नहीं मिल रहा है तो मैं निश्चित रूप से आगे बढ़ूंगा और स्टार्टर के रूप में उस ब्लॉग पोस्ट का उपयोग करके खुद को पॉलिश करूंगा।

+0

मैं ब्लॉग पोस्ट को स्टार्टर के रूप में उपयोग करता हूं। हम माइक्रोसॉफ्ट के सलाहकार के साथ काम कर रहे हैं और यह वह पद है जिसने हमें संदर्भित किया है। मैंने कोडप्लेक्स पर पावरहेल एमएसबिल्ड कार्य की कोशिश की, और यह मेरी पावरशेल स्क्रिप्ट पर त्रुटियों से बाहर निकलता है जो बार्ट डी स्मेट-लेखक कार्य में काम करता है। –

उत्तर

7

आप Psake - पावरशेल आधारित निर्माण वातावरण को भी देखना चाहेंगे।

9

3.5 के लिए http://powershellmsbuild.codeplex.com/ का उपयोग कर सकता है। It'd be nice if there was a NuGet package for it that one could leverage via NuGet package restore

4.0 है एक Windows Powershell Task Factory जो आप प्राप्त कर सकते हैं in the code gallery MSBuild Extension Pack (one of the top task libraries - 400+ Tasks & recommended in Inside MSBuild)PowerShellTaskFactory है में रोल किया जाता है (एक झलक के लिए the download section of this example release से मदद फ़ाइल डाउनलोड)।

4

Duplicate Question and Answer I Posted, यहां पोस्ट करने के लिए मतदान के लिए पोस्टरिटी के लिए यहां। मुख्य अंतर यह है कि यह प्रश्न ओओटीबी होने के लिए बाध्य था और मेरा आत्म-जवाब उस बाधा के भीतर रहता है।

प्रश्न

Powershell एक तरीका है कि सही ढंग से कॉल करने कि PowerShell नहीं हैं साथ interoperates में एक मनमाना आदेश और फिर बबल सामने पार्स और निष्पादन त्रुटियों के साथ यह गति प्रदान करने के लिए एक आसान तरीका है करने के लिए प्रतीत नहीं होता है - जैसे, cmd.exe , TeamCity आदि

मेरा प्रश्न सरल है। ओओटीबी एमएसबिल्ड वी 4 और पावरशेल वी 3 के साथ मेरे लिए सबसे अच्छा तरीका क्या है (सुझावों के लिए खुला- एक उपयुक्त उत्पादन तैयार एमएसबिल्ड टास्क को रद्द नहीं करेगा, लेकिन यह आसान है - पावरशेल टास्क फैक्ट्री नमूना लेने और यह सुझाव देने से थोड़ा मजबूत होना चाहिए। .ps1 स्क्रिप्ट का एक आमंत्रण चलाने के लिए इसे (और आमतौर पर) एक छोटे स्क्रिप्ट सेगमेंट, या (आमतौर पर) एक आमंत्रण चलाने के लिए इसे ट्विक करें (या आमतौर पर)

मुझे लगता है कि यह कुछ सामान्य होना चाहिए:

<Exec 
    IgnoreStandardErrorWarningFormat="true" 
    Command="PowerShell &quot;$(ThingToDo)&quot;" /> 

उदासी काम नहीं करता है कि: -

  1. अगर ThingToDo पार्स करने के लिए विफल रहता है, यह चुपचाप
  2. विफल रहता है ThingToDo एक स्क्रिप्ट मंगलाचरण जो मौजूद नहीं है है, यह विफल रहता है
  3. अगर आप एक ERRORLEVEL आधारित .cmd परिणाम का प्रचार करना चाहते हैं, यह बालों हो जाता है
  4. यदि आप ThingToDo में " उद्धरण एम्बेड करना चाहते हैं, यह काम नहीं करेगा

तो, क्या MSBuild से PowerShell होना चाहिए चलाने का बुलेट प्रूफ तरीका है? क्या सबकुछ ठीक करने के लिए मैं कुछ PsGet कर सकता हूं?

उत्तर

Weeeeelll, आप कुछ देर तक इस तरह चढ़ा हुआ इस्तेमाल कर सकते हैं जब तक आप एक बेहतर तरीका खोजने के: -

<PropertyGroup> 
    <__PsInvokeCommand>powershell "Invoke-Command</__PsInvokeCommand> 
    <__BlockBegin>-ScriptBlock { $errorActionPreference='Stop';</__BlockBegin> 
    <__BlockEnd>; exit $LASTEXITCODE }</__BlockEnd> 
    <_PsCmdStart>$(__PsInvokeCommand) $(__BlockBegin)</_PsCmdStart> 
    <_PsCmdEnd>$(__BlockEnd)"</_PsCmdEnd> 
</PropertyGroup> 

और फिर 'सभी' आप क्या करने की जरूरत है:

<Exec 
    IgnoreStandardErrorWarningFormat="true" 
    Command="$(_PsCmdStart)$(ThingToDo)$(_PsCmdEnd)" /> 

इस की एकल रिडीमिंग सुविधा (सभी त्रुटि प्रकारों को फँसाने के अलावा मैं सोच सकता हूं), यह है कि यह किसी भी पावरशेल संस्करण और किसी भी एमएसबिल्ड संस्करण के साथ ओओटीबी काम करता है।

मुझे अपना कोट मिल जाएगा।

0
मज़ा का एक सा के साथ

, मैं इस काम करने के एक काफी साफ रास्ता के साथ आने में कामयाब रहे:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <!-- #1 Place this line at the top of any msbuild script (ie, csproj, etc) --> 
    <PropertyGroup><PowerShell># 2>nul || type %~df0|find /v "setlocal"|find /v "errorlevel"|powershell.exe -noninteractive -&amp; exit %errorlevel% || #</PowerShell></PropertyGroup> 

    <!-- #2 in any target you want to run a script --> 
    <Target Name="default" > 

    <PropertyGroup> <!-- #3 prefix your powershell script with the $(PowerShell) variable, then code as normal! --> 
     <myscript>$(PowerShell) 
     # 
     # powershell script can do whatever you need. 
     # 
     dir ".\*.cs" -recurse |% { 
     write-host Examining file named: $_.FullName 
     # do other stuff here... 
     } 
     $answer = 2+5 
     write-host Answer is $answer ! 
     </myscript> 
    </PropertyGroup> 

    <!-- #4 and execute the script like this --> 
    <Exec Command="$(myscript)" EchoOff="true" /> 
    </Target> 
</Project> 

नोट्स:

  • तुम अब भी मानक Exec टास्क सुविधाओं का उपयोग कर सकते हैं! (देखें: https://msdn.microsoft.com/en-us/library/x8zx72cd.aspx)
  • अपने powershell स्क्रिप्ट <> या & वर्णों का उपयोग करने की जरूरत है, बस एक CDATA आवरण में सामग्री जगह:

    <script2><![CDATA[ $(PowerShell) 
        # your powershell code goes here! 
        write-host "<<Hi mom!>>" 
    ]]></script2> 
    
  • आप MSBuild स्क्रिप्ट आप कर सकते हैं करने के लिए आइटम वापसी चाहते हैं उन्हें मिलती है:

    <script3>$(PowerShell) 
        # your powershell code goes here! 
        (dir "*.cs" -recurse).FullName 
    </script3> 
    
    <Exec Command="$(script3)" EchoOff="true" ConsoleToMSBuild="true"> 
        <Output TaskParameter="ConsoleOutput" PropertyName="items" /> 
    </Exec> 
    <Touch Files="$(items)" /> 
    

मिलते हैं! तो आप उन वस्तुओं का उपयोग किसी अन्य एमएसबिल्ड कार्य के साथ कर सकते हैं: डी

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