我正在使用PowerCLI模块用于VMWare,我需要关闭4台计算机(所以组1关闭,确认它们全部关闭,组2关闭,确认它们全部关闭等等)。它是重要的是我确认一组服务器已关闭,然后再转到下一组。
为节省时间,我想将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
}
}
提前致谢!
答案 0 :(得分:0)
在轮询循环中将$ maxcounter添加到$ counter将导致循环只执行一次。 (第二次通过循环$ counter将等于$ maxcounter)。
我认为你想要$counter++
。
我对PowerCLI VMware模块一无所知,但如果$gsservers.reset()
导致$ gsservers中包含的服务器列表发生变化,那么会引入另一个错误(因为第二个循环不会检查您发送的服务器集在第一个循环中关闭。
答案 1 :(得分:0)
你是说Cmd执行同步'Shutdown-VMGuest -VM $ _。名字-Confirm:$ false'?
然后我认为你应该使用PowerShell背景作业在后台运行你的Cmdlet。这样,您只需在后台的所有虚拟机上调用关闭cmd,而无需等待关闭cmdlet完成。
以下是一些有用的链接:http://blogs.technet.com/b/heyscriptingguy/archive/2012/12/31/using-windows-powershell-jobs.aspx和http://msdn.microsoft.com/en-us/library/windows/desktop/dd878288(v=vs.85).aspx
问候。