2011-06-07 16 views
12


मैं सी # में एक cmdlet बनाने की कोशिश कर रहा हूं।पावरशेल - रनस्पेस में आयात-मॉड्यूल कैसे करें

[Cmdlet(VerbsCommon.Get, "HeapSummary")] 
public class Get_HeapSummary : Cmdlet 
{ 
    protected override void ProcessRecord() 
    { 
     RunspaceConfiguration config = RunspaceConfiguration.Create(); 
     Runspace myRs = RunspaceFactory.CreateRunspace(config); 
     myRs.Open(); 

     RunspaceInvoke scriptInvoker = new RunspaceInvoke(myRs); 
     scriptInvoker.Invoke("Set-ExecutionPolicy Unrestricted"); 

     Pipeline pipeline = myRs.CreatePipeline(); 
     pipeline.Commands.Add(@"Import-Module G:\PowerShell\PowerDbg.psm1"); 
     //... 
     pipeline.Invoke(); 

     Collection<PSObject> psObjects = pipeline.Invoke(); 
     foreach (var psObject in psObjects) 
     { 
      WriteObject(psObject); 
     } 
    } 
} 

लेकिन PowerShell में इस cmdlet निष्पादित करने के लिए कोशिश कर रहा है मुझे इस त्रुटि देता है: अवधि आयात-मॉड्यूल एक cmdlet के नाम के रूप में मान्यता प्राप्त नहीं है कोड इस तरह दिखता है। PowerShell में एक ही आदेश मुझे यह त्रुटि नहीं देता है। अगर मैं 'गेट-कमान' पर अमल के बजाय, मैं देख सकता है कि 'आह्वान-मॉड्यूल' एक cmdlet के रूप में सूचीबद्ध किया गया है।

वहाँ एक Runspace में एक 'आयात-मॉड्यूल' करने के लिए एक तरीका है?

धन्यवाद!

उत्तर

18

वहाँ प्रोग्राम के रूप में मॉड्यूल आयात करने के लिए दो तरीके हैं, लेकिन मैं पहली बार अपने विधि को संबोधित करेंगे। आपकी लाइन pipeline.Commands.Add("...") केवल कमांड जोड़ना चाहिए, कमांड और पैरामीटर नहीं। पैरामीटर अलग से जोड़ा जाता है:

# argument is a positional parameter 
pipeline.Commands.Add("Import-Module"); 
var command = pipeline.Commands[0]; 
command.Parameters.Add("Name", @"G:\PowerShell\PowerDbg.psm1") 

ऊपर पाइप लाइन एपीआई थोड़ा उपयोग करने के लिए अनाड़ी है और हालांकि यह उच्च स्तर APIs को के आधार पर है अनौपचारिक रूप से कई उपयोगों के लिए मान्य नहीं है।

# if Create() is invoked, a runspace is created for you 
var ps = PowerShell.Create(myRS); 
ps.Commands.AddCommand("Import-Module").AddArgument(@"g:\...\PowerDbg.psm1") 
ps.Invoke() 

एक और तरीका है उत्तरार्द्ध विधि का उपयोग कर जब InitialSessionState, जो बीज की जरूरत से बचा जाता है का उपयोग कर मॉड्यूल को पहले से लोड करने के लिए है: powershell वी 2 या उच्चतर में ऐसा करने का सबसे अच्छा तरीका है System.Management.Automation.PowerShell प्रकार और उसके धाराप्रवाह एपीआई का उपयोग कर रहा है रनस्पेस Import-Module के साथ स्पष्ट रूप से। कि कैसे करना है पर यहाँ मेरे ब्लॉग देखें:

http://nivot.org/nivot2/post/2010/05/03/PowerShell20DeveloperEssentials1InitializingARunspaceWithAModule.aspx

http://nivot.org/blog/post/2010/05/03/PowerShell20DeveloperEssentials1InitializingARunspaceWithAModule

आशा इस मदद करता है।

+2

धन्यवाद! लेकिन विधि जोड़ें() शून्य लौटाता है। मुझे लगता है कि आपको कमांड ऑब्जेक्ट का उपयोग करने और इसमें पैरामीटर जोड़ने की आवश्यकता है और उसे विधि जोड़ें में भेज दें। आप इसे प्रोग्रामेटिक तरीके से करने के दो तरीकों के बारे में बात कर रहे हैं, दूसरा तरीका क्या है? – Absolom

+0

ओह, दूसरे तरीके से अद्यतन उत्तर। – x0n

+0

मुझे यह भी पता चला कि यदि आपको अपना मॉड्यूल आयात करने का प्रयास करते समय "प्राधिकरण प्रबंधक जांच विफल" अपवाद मिलता है, तो सुनिश्चित करें कि आपकी .psm1 फ़ाइल UTF8 में सहेजी गई है और ASCII में नहीं है। – Absolom

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