2013-05-02 78 views
9

我試圖在我的應用程序中添加一些非常有限的PowerShell支持:我要定期運行一個用戶自定義的PowerShell腳本,並顯示任何輸出能力,(最終)能夠處理進度通知和用戶提示請求。 I 不需要需要命令行式的交互式支持,或(我認爲)遠程訪問或運行多個併發腳本的能力,除非用戶腳本在我託管的shell內自行完成。我最終想要異步運行腳本或在後臺線程上運行腳本,並且可能會使用一些初始變量和 cmdlet對shell進行種子,但這種功能很可能會「花哨」。主機的PowerShell:PowerShell中與運行空間與RunspacePool與管道

我一直在閱讀MSDN documentation about writing host application code,但是當它高興地介紹如何創建PowerShell對象,或Runspace,或RunspacePool,或者Pipeline,沒有跡象顯示有關爲什麼人會在選擇任何一種方法的另一個。

認爲我到這兩個中的一個,但我喜歡一些反饋,哪些方法是一個更好的採取:

PowerShell shell = PowerShell.Create(); 
shell.AddCommand(/* set initial state here? */); 
shell.AddStatement(); 
shell.AddScript(myScript); 
shell.Invoke(/* can set host! */); 

或:

Runspace runspace = RunspaceFactory.CreateRunspace(/* can set host and initial state! */); 
PowerShell shell = PowerShell.Create(); 
shell.Runspace = runspace; 
shell.AddScript(myScript); 
shell.Invoke(/* can set host here, too! */); 

(其中一個需要PSHost派生類的方法是EnterNestedPrompt(),我不知道用戶定義的腳本我運行是否會導致該到被調用或沒有。如果能的話,我會負責「出發一個新的嵌套輸入廁所P」(as per here)......如果可以影響其路徑上面走,這也將是很好的瞭解。)

謝謝!

+2

你實際上並不需要一個主機。只要確保避免寫入主機,讀取主機等的調用。有一種方法來檢查PS是否有主機連接,但我現在不記得它。 – 2013-05-02 09:14:40

+0

我可能並不需要一個PSHost,但是在我的例子中,我想要一個...我期待用戶定義的腳本有偶爾的診斷信息,我希望能夠顯示。 (我會編輯原始文章以使其更清楚。) – JaredReisinger 2013-05-02 17:45:39

回答

1

你正在超越它。你在樣本中展示的代碼是一個好的開始。現在您只需要讀取Invoke()的結果並檢查錯誤和警告流。

PowerShell主機提供了一些掛鉤你想要做你不需要PowerShell主機是什麼運行空間可以使用與用戶進行溝通,像流和格式輸出,進度顯示,報告錯誤,等等。。您可以使用PowerShell類從腳本執行中讀取結果,檢查錯誤,警告,讀取輸出流並使用應用程序的工具向用戶顯示通知。與編寫整個PowerShell主機相比,這將更加直接和有效,以便在檢測到錯誤時顯示消息框。

而且,PowerShell的對象有一個運行空間創建時,你不需要給它一個。如果您需要保留運行空間以保留環境,則每次調用Invoke後,都應保留整個PowerShell對象並清除命令和所有流。

你應該問的一個問題是如何處理的PowerShell ::調用()的結果和讀取的PowerShell ::流。

+0

嘿!你可以擴展你在「調用Invoke後每次」保持整個PowerShell對象並清除命令和所有流「嗎?我目前沒有使用runspaces,並且正在尋找這個原因來實現它們,但是看起來我可以使用PowerShell方法來實現這個目標?謝謝!! – 2015-10-27 07:05:35

+0

請提出正確的問題。在評論中回答問題是沒有意義的。 ;) – Serjx86 2015-10-28 13:27:11