2010-04-16 29 views
7

我期望通過自動化運行一些PowerShell腳本。喜歡的東西:如何通過自動運行PowerShell腳本而不運行主機問題

IList errors; 
Collection<PSObject> res = null; 
using (RunspaceInvoke rsi = new RunspaceInvoke()) 
{ 
    try 
    { 
     res = rsi.Invoke(commandline, null, out errors); 
    } 
    catch (Exception ex) 
    { 
     LastErrorMessage = ex.ToString(); 
     Debug.WriteLine(LastErrorMessage); 
     return 1; 
    } 
} 

我現在面臨的問題是,如果我的腳本使用的cmdlet如write-host上述拋出System.Management.Automation.CmdletInvocationException -

因爲 當前宿主,並不能實現不能調用此函數 吧。

解決此問題有哪些好的選擇?

+0

Scott,我面臨同樣的問題。你能提供一些關於你如何實施的指導或代碼嗎? – 2010-11-14 22:24:16

+0

好的,我自己找到了答案:只需繼承PSHost,PSHostUserInterface和PSHostRawUserInterface,並讓方法不做任何事情/返回null。爲了追蹤通常會發生的情況,可以記錄否則將打印在cmd行的消息/文本。 – 2010-11-15 15:35:07

回答

11

一個選項是創建一個寫主機函數並將其注入到您的運行空間。該函數將優先於具有相同名稱的cmdlet。在這個函數中,如果你的應用程序是一個控制檯應用程序,或者如果你的應用程序是一個GUI應用程序,那麼你無能爲力,或者可能使用[console] :: writeline(),將一些對象注入到PowerShell會話中,該函數可以寫入輸出(查看Runspace.SessionStateProxy.SetVariable)。

另一個(有點複雜)選項是實現PowerShell hosting interfaces in your app

+0

我使用託管接口的方法。太糟糕了,沒有用於託管的默認NonInteractive用戶界面。 – 2010-04-17 17:11:40