2014-06-18 33 views
11

我有一個我正在寫入的腳本,它依賴於導入模塊中的函數。由於IO(網絡請求),此腳本需要一段時間,我想將其並行化爲數十萬次腳本塊迭代。如何在創建了具有寫入主機命令的代碼創建的PowerShell外殼中執行腳本?

嘗試了幾種不同的方法(由於受到Start-Job和其他條件的限制而成功),目前的實現依賴於預先創建通過$shell = [Powershell]::Create()創建的一個PowerShell「shell」池。

我必須調用一個模塊方法來引導shell(所以它處於正確的狀態),其中有一個對Write-Host的調用。當我打電話$shell.Invoke()出現以下錯誤:

寫主持人:提示用戶的命令失敗,因爲主機程序或命令的類型不支持用戶 互動。嘗試支持用戶交互的主機程序,例如Windows PowerShell控制檯或Windows PowerShell ISE,並從不支持用戶交互的命令類型(如 Windows PowerShell工作流程)中刪除與提示相關的命令。

現在,由於該模塊是自定義的,我可以刪除Write-Host調用,但是這會降低用戶在直接由最終用戶運行時的友好性。如果參數爲true,我可以創建一個switch參數,該參數不執行Write-Host,但要做到這一點是一個很好的工作(可行,但我寧願不)。

有什麼辦法可以讓Write-Host在這種情況下不出錯?我實際上並不關心這種情況下的輸入,我只是不想要這些錯誤。

+0

你是如何導入和從外殼調用模塊?我意識到這是一個回答問題的答案(如果你沒有你的代碼,我可以單獨提問),但是我試圖複製這個錯誤,並且不能像描述的那樣工作。已嘗試'$ shell.AddCommand(「Import-Module」)。AddArgument(「C:\ Path \ to \ module \ MyModule」);',但是當我嘗試從MyModule調用一個函數時,調用「帶有」0「參數:」術語'TryMe'不被識別爲一個cmdlet的名稱......' – ruffin

+0

我正在運行'$ InitScriptBlock = {Import-Module MyModule}','$ shell .AddScript($ InitializationScriptBlock)','$ shell.Invoke()'然後''shell.Commands.Clear'根據我的代碼在git :) – KallDrexx

回答

16

最快的方法是在腳本中定義一個虛擬的write-host函數,或者在運行腳本之前在運行空間中單獨定義它。

$ps.addscript("function write-host {}").invoke() 
$ps.commands.clear() 
# now you can invoke scripts that use write-host 
# feel free to implement a write-host that writes to a log file 

那樣簡單。你得到這個錯誤的原因是因爲像這樣的編程調用並不期望用戶交互。有許多方法可以完成這項工作,但它使用不同的API。

+0

好主意,工作就像一個魅力! – KallDrexx

5

如果需要輸出,你可以使用:

$ps.addscript("function write-host($out) {write-output $out}").invoke() 
$ps.commands.clear() 
相關問題