2011-06-07 19 views
12


C# 'de bir cmdlet oluşturmaya çalışıyorum.PowerShell - Bir Çalışma Alanında Alma Modülü Nasıl Yapılır

[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); 
     } 
    } 
} 

Ama PowerShell içinde bu cmdlet yürütmeye çalışırken bana bu hata veriyor: vadeli ithalat-Modülü bir cmdlet'inin adı olarak tanınmayan kod şöyle görünür. PowerShell'deki aynı komut bana bu hatayı vermiyor. Bunun yerine 'Get-Command' çalıştırırsam 'Invoke-Module' modülünün bir CmdLet olarak listelendiğini görebiliyorum.

Bir Runspace'da 'Import-Module' yapmanın bir yolu var mı?

Teşekkürler!

cevap

18

Programlı olarak modülleri içe aktarmanın iki yolu vardır, ancak önce yönteminizi ele alacağım. Satırınız pipeline.Commands.Add("...") sadece komutu değil, komutu AND parametresini eklemelidir. parametre ayrı olarak eklenir:

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

yukarıdaki boru hattı API kullanmak hantal biraz ve daha yüksek seviyeli bir API birçok dibinde olsa gayri birçok kullanımlar için uygun bulunmamaktadır.

# 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() 

ikincisi yöntem kullanılarak bir başka yolu tohuma ihtiyacı ortadan kaldırır InitialSessionState kullanarak modülleri önceden yüklemek için geçerli: Powershell v2 veya daha yüksek bunu yapmanın en iyi yolu System.Management.Automation.PowerShell Tipi ve akıcı API kullanarak gereğidir Import-Module ile açıkça yayın yapın. Bunun nasıl burada blogumu bakınız:

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

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

Umut bu yardımcı olur.

+2

Teşekkürler! Ancak, Add() yöntemi void değerini döndürür. Bir Komut nesnesi kullanmanız ve buna bir parametre eklemeniz ve bunu Add (Yöntem) yöntemine iletmeniz gerektiğini tahmin ediyorum. Programlı olarak yapmanın iki yolu hakkında konuşuyorsunuz, ikinci yol nedir? – Absolom

+0

oops, ikinci yolla cevap güncellendi. – x0n

+0

Ayrıca, modülünüzü içe aktarmaya çalışırken "AuthorizationManager denetimi başarısız" istisnası alırsanız, .psm1 dosyanızın ASCII'de değil UTF8'de kayıtlı olduğundan emin olun. – Absolom

İlgili konular