2012-10-03 72 views
2

我是PowerShell的新手,並在C#中運行PowerShell cmd-lets。具體而言,我試圖使用Citrix的XenDesktop SDK編寫Web應用程序來管理我們的XenDesktop環境。在C#代碼中運行PSCmdLets(Citrix XenDesktop)

就像一個快速測試,我參考了Citrix BrokerSnapIn.dll,它看起來好像給了我很好的C#類。但是,當我使用此錯誤消息打開.Invoke時: 「無法直接調用從PSCmdlet派生的Cmdlet」。

我搜索並嘗試了一堆東西,但不知道如何調用PSCmdlets。我有點遺憾,我不得不使用字符串和運行空間/管道等來執行此操作。

在先進的感謝, NB

using System; 
using System.Management.Automation; 
using System.Management.Automation.Runspaces; 
using Citrix.Broker.Admin.SDK; 

namespace CitrixPowerShellSpike 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var c = new GetBrokerCatalogCommand {AdminAddress = "xendesktop.domain.com"}; 
      var results = c.Invoke(); 
      Console.WriteLine("all done"); 
      Console.ReadLine(); 
     } 
    } 
} 

回答

6

您需要舉辦PowerShell引擎,以執行PSCmdlet例如(來自MSDN docs):

// Call the PowerShell.Create() method to create an 
    // empty pipeline. 
    PowerShell ps = PowerShell.Create(); 

    // Call the PowerShell.AddCommand(string) method to add 
    // the Get-Process cmdlet to the pipeline. Do 
    // not include spaces before or after the cmdlet name 
    // because that will cause the command to fail. 
    ps.AddCommand("Get-Process"); 

    Console.WriteLine("Process     Id"); 
    Console.WriteLine("----------------------------"); 

    // Call the PowerShell.Invoke() method to run the 
    // commands of the pipeline. 
    foreach (PSObject result in ps.Invoke()) 
    { 
    Console.WriteLine(
      "{0,-24}{1}", 
      result.Members["ProcessName"].Value, 
      result.Members["Id"].Value); 
    } 
} 
+0

嗨基思,謝謝你的回答。我看到那篇文章(說實話,它試圖避免像「Get-Process」這樣的「魔術字符串」)在Citrix SDK中,對象瀏覽器顯示了一個像上面那樣的GetBrowserCatalogCommand,這樣我就可以利用強類型看起來我正在走你的路線 – NBPC77

+0

是的,從SMACmdlet派生的一個cmdlet和派生自SMAPSCmdlet的一個cmdlet之間的主要區別在於前者可以隔離使用,即不加載PowerShell引擎和後者不能。 –