我有一個我正在寫入的腳本,它依賴於導入模塊中的函數。由於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
在這種情況下不出錯?我實際上並不關心這種情況下的輸入,我只是不想要這些錯誤。
你是如何導入和從外殼調用模塊?我意識到這是一個回答問題的答案(如果你沒有你的代碼,我可以單獨提問),但是我試圖複製這個錯誤,並且不能像描述的那樣工作。已嘗試'$ shell.AddCommand(「Import-Module」)。AddArgument(「C:\ Path \ to \ module \ MyModule」);',但是當我嘗試從MyModule調用一個函數時,調用「帶有」0「參數:」術語'TryMe'不被識別爲一個cmdlet的名稱......' – ruffin
我正在運行'$ InitScriptBlock = {Import-Module MyModule}','$ shell .AddScript($ InitializationScriptBlock)','$ shell.Invoke()'然後''shell.Commands.Clear'根據我的代碼在git :) – KallDrexx