2009-07-18 10 views
8

पृष्ठभूमि

  • मैं PowerShell 2.0 का उपयोग कर रहा विंडोज 7 पर
  • मैं एक PowerShell मॉड्यूल में एक cmdlet लिख रहा हूँ ("मॉड्यूल से शुरू हो जाती है "पावरहेल 2.0 के लिए नया है)।
  • cmdlet का परीक्षण करने के लिए मैं विजुअल स्टूडियो 2008 में यूनिट परीक्षण लिख रहा हूं जो प्रोग्रामेटिक रूप से cmdlet का आह्वान करता है।

संदर्भ

  • This Article on MSDN को "Cmdlet के भीतर से cmdlet आह्वान कैसे" दिखाता है कि कैसे सी # से cmdlet कॉल करने के लिए।

स्रोत कोड

टिप्पणियाँ

  • मैं समझता हूं कि पावरहेल कमांड लाइन से वर्बोज आउटपुट को कैसे सक्षम और कैप्चर करना है; यह समस्या नहीं है।
  • इस मामले में मैं प्रोग्रामिंग से सी # से cmdlet का आह्वान कर रहा हूं।
  • मुझे कुछ भी नहीं मिला जो मेरे विशिष्ट परिदृश्य को संबोधित करता है। कुछ लेखों का सुझाव है कि मुझे अपना खुद का पीएसहोस्ट लागू करना चाहिए, लेकिन महंगा लगता है और ऐसा लगता है कि cmdlet को टेक्स्ट के रूप में कॉल करना है, जिसे मैं टालना चाहूंगा क्योंकि यह दृढ़ता से टाइप नहीं किया गया है। पर 2009-07-20

    यहाँ है

अद्यतन स्रोत नीचे उत्तर के आधार पर कोड है।

कुछ बातें अभी भी मेरे लिए स्पष्ट नहीं हैं: * कैसे (आदर्श ps objet के लिए एक स्ट्रिंग के रूप में यह पारित करने के लिए बिना) "रातों-रंग" cmdlet कॉल करने के लिए * कैसे वर्बोज़ उत्पादन के रूप में प्राप्त करने के लिए यह अंत में एक संग्रह प्राप्त करने के बजाय उत्पन्न किया गया है।

using System; 
    using System.Management.Automation; 

    namespace DemoCmdLet1 
    { 
     class Program 
     { 
      static void Main(string[] args) 
      { 
       var ps = System.Management.Automation.PowerShell.Create(); 

       ps.Commands.AddScript("$verbosepreference='continue'; write-verbose 42"); 

       foreach (var i in ps.Invoke<string>()) 
       { 
        Console.WriteLine("normal output: {0}" , i); 
       } 
       foreach (var i in ps.Streams.Verbose) 
       { 
        Console.WriteLine("verbose output: {0}" , i); 
       } 

      } 
     } 

     [Cmdlet("Get", "Colors")] 
     public class GetColorsCommand : Cmdlet 
     { 
      protected override void ProcessRecord() 
      { 
       this.WriteObject("Red"); 
       this.WriteVerbose("r"); 
       this.WriteObject("Green"); 
       this.WriteVerbose("g"); 
       this.WriteObject("Blue"); 
       this.WriteVerbose("b"); 

      } 

     } 
    } 

कोड के ऊपर इस उत्पादन उत्पन्न करता है: Powershell वर्ग का उपयोग करके

d:\DemoCmdLet1\DemoCmdLet1>bin\Debug\DemoCmdLet1.exe 
verbose output: 42 

2010-01-16

पर अद्यतन (System.Management.Automation में लेकिन केवल संस्करण में पाया पावरहेल 2.0 एसडीके के साथ आने वाली असेंबली के बारे में, विंडोज 7 पर आउट ऑफ़ द बॉक्स नहीं आता है) मैं प्रोग्रामेटिक रूप से cmdlet को कॉल कर सकता हूं और वर्बोज आउटपुट प्राप्त कर सकता हूं। शेष भाग वास्तव में उस शक्तिशक्ति उदाहरण के लिए एक कस्टम cmdlet जोड़ना है - क्योंकि यह मेरा मूल लक्ष्य था - यूनिट को मेरे cmdlets का परीक्षण करने के लिए जो शक्तियों के साथ आते हैं।

class Program 
{ 
    static void Main(string[] args) 
    { 
     var ps = System.Management.Automation.PowerShell.Create(); 
     ps.AddCommand("Get-Process"); 
     ps.AddParameter("Verbose"); 
     ps.Streams.Verbose.DataAdded += Verbose_DataAdded; 
     foreach (PSObject result in ps.Invoke()) 
     { 
      Console.WriteLine(
        "output: {0,-24}{1}", 
        result.Members["ProcessName"].Value, 
        result.Members["Id"].Value); 
     } 
     Console.ReadKey(); 
    } 

    static void Verbose_DataAdded(object sender, DataAddedEventArgs e) 
    { 
     Console.WriteLine("verbose output: {0}", e.Index); 
    } 
} 


[Cmdlet("Get", "Colors")] 
public class GetColorsCommand : Cmdlet 
{ 
    protected override void ProcessRecord() 
    { 
     this.WriteObject("Hello"); 
     this.WriteVerbose("World"); 
    } 
} 
+1

मेरे उत्तर में एक लापता बैकटिक था - इससे $ verbosepreference चर का मूल्यांकन समय से पहले किया जा रहा है। – x0n

+0

आपने उत्तर के रूप में मेरी प्रतिक्रिया क्यों नहीं चिह्नित की है? – x0n

+0

यदि आप रीयल-टाइम वर्बोज़ रिकॉर्ड चाहते हैं, तो पावरहेल इंस्टेंस की धाराओं की संपत्ति पर डेटाचांग ईवेंट की सदस्यता लें। – x0n

उत्तर

10
  • शब्दाडंबरपूर्ण उत्पादन जब तक $VerbosePreference सेट किया गया है कम से कम करने के लिए नहीं वास्तव में उत्पादन होता है "जारी रखें।"
  • उपयोग PowerShell प्रकार अपने cmdlet को चलाने के लिए, और powershell स्क्रिप्ट में Streams.Verbose प्रॉपर्टी

उदाहरण से VerboseRecord उदाहरणों पढ़ें:

ps> $ps = [powershell]::create() 
ps> $ps.Commands.AddScript("`$verbosepreference='continue'; write-verbose 42") 
ps> $ps.invoke() 
ps> $ps.streams.verbose 
Message InvocationInfo       PipelineIterationInfo 
------- --------------       --------------------- 
42  System.Management.Automation.Invocat... {0, 0} 

यह सी # में अनुवाद करने के लिए आसान होना चाहिए।

0
1.  string scriptFile = "Test.ps1"; 
2.  using (PowerShell ps = PowerShell.Create()) 
3.  { 
4.   const string getverbose = "$verbosepreference='continue'"; 
5.   ps.AddScript(string.Format(getverbose)); 
6.   ps.Invoke(); 
7.   ps.Commands.Clear(); 
8.   ps.AddScript(@".\" + scriptFile); 
9.   ps.Invoke(); 
10.   foreach (var v in ps.Streams.Verbose) 
11.   { 
12.    Console.WriteLine(v.Message); 
13.   } 
14.  } 

महत्वपूर्ण लाइनों लाइन 5 और 6 के इस सत्र के लिए और आगामी नए आदेश और स्क्रिप्ट के लिए $ verbosepreference मूल रूप से सेट कर रहे हैं।

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