पृष्ठभूमि
- मैं PowerShell 2.0 का उपयोग कर रहा विंडोज 7 पर
- मैं एक PowerShell मॉड्यूल में एक cmdlet लिख रहा हूँ ("मॉड्यूल से शुरू हो जाती है "पावरहेल 2.0 के लिए नया है)।
- cmdlet का परीक्षण करने के लिए मैं विजुअल स्टूडियो 2008 में यूनिट परीक्षण लिख रहा हूं जो प्रोग्रामेटिक रूप से cmdlet का आह्वान करता है।
संदर्भ
- This Article on MSDN को "Cmdlet के भीतर से cmdlet आह्वान कैसे" दिखाता है कि कैसे सी # से cmdlet कॉल करने के लिए।
स्रोत कोड
यह मेरा वास्तविक कोड का एक आसुत संस्करण है — मैं इसे के रूप में संभव के रूप में छोटे बनाया है ताकि आप समस्या को देख सकते हैं मैं स्पष्ट रूप से हो रहा है:एक PowerShell cmdlet का वर्बोज़ आउटपुट को कैप्चर करने के लिए कैसे जब cmdlet प्रोग्राम के रूप में सी #
using System; using System.Management.Automation; namespace DemoCmdLet1 { class Program { static void Main(string[] args) { var cmd = new GetColorsCommand(); foreach (var i in cmd.Invoke<string>()) { Console.WriteLine("- " + i); } } } [Cmdlet("Get", "Colors")] public class GetColorsCommand : Cmdlet { protected override void ProcessRecord() { this.WriteObject("Hello"); this.WriteVerbose("World"); } } }
टिप्पणियाँ
- मैं समझता हूं कि पावरहेल कमांड लाइन से वर्बोज आउटपुट को कैसे सक्षम और कैप्चर करना है; यह समस्या नहीं है।
- इस मामले में मैं प्रोग्रामिंग से सी # से 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");
}
}
मेरे उत्तर में एक लापता बैकटिक था - इससे $ verbosepreference चर का मूल्यांकन समय से पहले किया जा रहा है। – x0n
आपने उत्तर के रूप में मेरी प्रतिक्रिया क्यों नहीं चिह्नित की है? – x0n
यदि आप रीयल-टाइम वर्बोज़ रिकॉर्ड चाहते हैं, तो पावरहेल इंस्टेंस की धाराओं की संपत्ति पर डेटाचांग ईवेंट की सदस्यता लें। – x0n