2009-08-12 13 views
6

हम अपने निर्माण प्रणाली के लिए NAnt बड़े पैमाने पर उपयोग करते हैं। हाल ही में, मैंने कुछ डेटाबेस संबंधित चीजों को करने के लिए कुछ PowerShell Cmdlets लिखा है। सबसे पहले, इन सीएमडलेट्स का इरादा नहीं था जो कि हमारी निर्माण प्रक्रिया के भीतर आवश्यक रूप से चल रहा था। हालांकि, यह हाल ही में एक आवश्यकता बन गई है और हम इन एनएएनटी आधारित निर्माण प्रक्रिया से इन सीएमडीलेट्स में से कुछ को चलाने के लिए चाहते हैं।एनएएनटी बिल्ड सिस्टम में पावरशेल सीएमडीलेट का उपभोग करने का एक अच्छा तरीका क्या है?

ये सीएमडीलेट सी # में लिखे गए हैं और हमारे पास उनके लिए स्नैपइन है (यदि यह बिल्कुल मायने रखता है)।

कुछ विचार:

  • PowerShell कॉल करने के लिए exec कार्य का प्रयोग करें? (सुनिश्चित नहीं है कि यह कैसे काम करेगा)
  • एक कस्टम NANT कार्य लिखें जो संदर्भ और सीएमडीलेट का उपयोग करता है?

ऐसा करने का एक अच्छा तरीका क्या हो सकता है?

उत्तर

5

आप निश्चित रूप से निष्पादन कार्य का उपयोग कर सकते हैं, प्रोग्राम विशेषता को powerhell.exe पर सेट कर सकते हैं और कमांडलाइन में "-Command {}" जैसे गुजरते हैं।

वैकल्पिक रूप से, आप निश्चित रूप से एक कस्टम NANT कार्य बना सकते हैं जो आपके cmdlets या स्क्रिप्ट को निष्पादित करने के लिए आंतरिक रूप से पावरहेल होस्टिंग API का उपयोग करता है। इसका एक सरल उदाहरण है (पीएस v1 एपीआई का उपयोग करके) here

8

आप अपने ps cmdlets को कॉल करने के लिए अपने नेंट स्क्रिप्ट में नीचे दिए गए निष्पादन कार्य का उपयोग कर सकते हैं।

<exec program="powershell" workingdir="${BuildManagementDir}" verbose="true"> 
    <arg value="-noprofile"/> 
    <arg value="-nologo"/> 
    <arg value="-noninteractive"/> 
    <arg value="-command"/> 
    <arg value=".\xyz.ps1"/> 
</exec> 
2

जीबी के उत्तर के आधार पर यह दूसरी तरफ है, यह कामकाजी समाधान है। जब पावरहेल चल रहा है जो तर्क लेता है तो आपको पावरहेल स्क्रिप्ट को फिर तर्कों को चलाने की आवश्यकता होती है।

PS yourscript.ps1 -arg1 value1 -arg2 value2 

NAnt में:

<exec program="powershell" workingdir="${powershell_dir}" verbose="true"> 
    <arg value=".\yourscript.ps1"/>  
    <arg value="-arg1 ${value1}"/> 
    <arg value="-arg2 ${value2}"/> 
</exec> 

सबसे अच्छा तरीका है मुझे लगता है कि NAnt के लिए पी एस में तर्क को परिभाषित करने के लिए है है

$value1=$args[0] 
$value2=$args[1] 

की तरह तो कमांड लाइन में आप का उपयोग करेगा:

PS yourscript.ps1 some_value1 some_value2 

फिर यह NAnt li में अनुवाद करता है के:

<property name="Value1" value="some_Value1" /> 
<property name="Value2" value="some_Value2" /> 

    <exec program="powershell" workingdir="${powershell_dir}" verbose="true"> 
     <arg value=".\yourscript.ps1"/>  
     <arg value="${value1}"/> 
     <arg value="${value2}"/> 
    </exec> 
0

सबसे अच्छा तरीका समान तरीकों का उपयोग करना है क्योंकि कोई कार्य शेड्यूलर में उपयोग करेगा। इसका मतलब है powershell-command तर्क के साथ चलाएं और & के साथ आदेश शुरू करें।

उदाहरण के लिए:

<exec program="powershell" workingdir="${ifscriptrequires}" verbose="true"> 
    <arg line="-Command" /> 
    <arg line="$amp; C:\scripts\somescript.ps1 -SwitchParam -someargument 'somevalue' 'somepositionalparameter'" /> 
</exec> 
+0

आप एम्परसेंड के आपके उपयोग को स्पष्ट कर सकते हैं? स्पष्टीकरण के बिना, आपका उत्तर बहुत अधिक दिखता है [वीजे एम का जवाब] (http://stackoverflow.com/a/4311491/622391)? –

+0

एम्परसैंड पावरहेल में कॉल ऑपरेटर है। निम्नलिखित विशेष ऑपरेटरों के तहत 'get-help about_operators' कमांड आउटपुट से है: 'और कॉल ऑपरेटर कमांड, स्क्रिप्ट या स्क्रिप्ट ब्लॉक चलाता है।कॉल ऑपरेटर, जिसे "आमंत्रण ऑपरेटर" भी कहा जाता है, आपको चर में संग्रहीत आदेशों को चलाने देता है और स्ट्रिंग द्वारा प्रतिनिधित्व किया जाता है। चूंकि कॉल ऑपरेटर कमांड को पार्स नहीं करता है, इसलिए यह कमांड पैरामीटर की व्याख्या नहीं कर सकता है। ' –

+1

आगे स्पष्टीकरण के लिए, मेरे अनुभव में, इसमें शामिल नहीं होने से स्क्रिप्ट के बजाय powerhell.exe द्वारा तर्कों को संसाधित किया जा सकता है या सामान्य रूप से खो दिया जा सकता है। –

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

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