2013-10-04 73 views
0

我正在使用VMWare的PowerCLI模塊,我需要關閉4臺計算機(所以關閉組1,確認它們全部關閉,關閉組2,等等,確認它們全部關閉,等等。 ..)在進入下一組之前,確認一組服務器已關閉,這一點很重要。Powershell並行和串行操作

爲了節省時間,我想將VMGuest-Shutdown發送到第一組中的所有服務器,然後返回並逐一驗證電源狀態,然後再轉到下一組服務器。

這是我的,但它似乎並沒有工作。我會假設我可以在第一個命令集的一個子程序中做到這一點,但是我知道該怎麼處理它。

$gssservers | Where-Object {$_.Tier -match "App"} | Foreach-Object { 
    Shutdown-VMGuest -VM $_.Name -Confirm:$false 
    } 
$gssservers.reset() 
$gssservers | Where-Object {$_.Tier -match "App"} | Foreach-Object { 
    $counter = 0 
    while((Get-VM $_.Name).PowerState -ne "PoweredOff" -and $counter -lt $maxcounter){ 
     sleep 5 
     $counter += $maxcounter 
     } 
} 

在此先感謝!

+1

什麼不起作用? – dugas

回答

0

將$ maxcounter添加到輪詢循環中的$ counter將導致循環只執行一次。 (第二次通過循環$計數器將等於$ maxcounter)。

我想你想$counter++來代替。

我對PowerCLI VMware模塊一無所知,但如果$gsservers.reset()導致$ gsservers中包含的服務器列表發生更改,那麼會引入另一個錯誤(因爲第二個循環不會檢查在第一個循環中發送關機的服務器)。

0

你是說Cmd執行synchronoulsy'Shutdown-VMGuest -VM $ _。Name -Confirm:$ false'?

然後我認爲你應該使用PowerShell回地面作業來在後臺運行我的Cmdlet。通過這種方式,您可以簡單地在後臺調用所有vms上的關閉cmd,而無需等待關閉cmdlet完成。

下面是一些有用的鏈接:http://blogs.technet.com/b/heyscriptingguy/archive/2012/12/31/using-windows-powershell-jobs.aspxhttp://msdn.microsoft.com/en-us/library/windows/desktop/dd878288(v=vs.85).aspx

問候。