2011-09-09 130 views
3

我有一個小的Powershell腳本,用於在發生長時間停電時關閉我的虛擬機。它需要一個特定的VM對象並強制關閉。Powershell關閉虛擬機

Function DirtyShutdown 
{ param([VMware.VimAutomation.ViCore.Impl.V1.Inventory.VirtualMachineImpl]$VM) 
$VM | Stop-VM -Confirm:$false 
} 

我想加快這個過程,使用start-job命令並行運行所有這些任務。我嘗試過使用幾種變體,包括我認爲是正確的以下內容。

Start-Job -InputObject $VM -ScriptBlock{ $input | Shutdown-VMGuest -Confirm:$false } 

基於它出現的問題,接收-作業輸出是在使用中(加入上述函數被調用之前)在啓動工作的上下文中未裝載單元。

發生這種情況的正確語法是什麼?

+0

有兩個答案,我會發布他們兩個,看看大家喜歡什麼。 – halr9000

回答

6

雖然我很欣賞爲此任務使用PowerShell v2作業子系統的願望,但請注意,vCenter有一個內置作業系統,您可以在此處使用它。大多數對您的環境執行更改的PowerCLI cmdlet都具有RunAsync參數。要知道哪些,運行這段PowerShell代碼:

get-help * -parameter runasync 

的RunAsync參數將你的命令(S)與vCenter中排隊起來。該cmdlet將返回一個任務對象,然後立即將控制權返回給您的腳本。

把它變成你的情況回答,只是追加「-runasync」你停止-VM命令的末尾,就像這樣:

$VM | Stop-VM -Confirm:$false -RunAsync 
+0

這正是我所希望的 - 我沒有看到我審查過的任何文檔中的RunAsync選項,並且我在這幾個小時。像這樣的日子真的讓我想念Bash。 –

+1

新別名男人獲取幫助:) – halr9000

0

每次啓動工作,PowerShell的創建新的運行空間。這意味着您可能需要初始化的新環境,包括加載管理單元和連接到VI服務器。 Start-Job有一個參數,可以在這裏使用,稱爲InitializationScript。嘗試這樣的:

Start-Job -InitializationScript { Add-PSSnapin VMware.VimAutomation.Core } { 
    Connect-ViServer myserver 
    Get-VM foo | Stop-VM 
} 
+0

我實際上無法得到這個工作;工作無限期地運行。但是,語法是合理的,你應該看看它是否適用於你。我已經用VMware工程打開了一個主題,以查看這是一個錯誤還是僅僅是我。 – halr9000