0

我正在为 VMWare 使用 PowerCLI 模块,我需要关闭 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
        }
}

提前致谢!

4

2 回答 2

0

在轮询循环中将 $maxcounter 添加到 $counter 将导致循环仅执行一次。(第二次循环 $counter 将等于 $maxcounter)。

我想你想要$counter++

我对 PowerCLI VMware 模块一无所知,但是如果$gsservers.reset()导致 $gsservers 中包含的服务器列表发生更改,那么这将引入另一个错误(因为第二个循环不会检查您发送关闭的服务器集到在第一个循环中)。

于 2013-10-06T02:00:22.207 回答
0

您是说 Cmd 执行 synchronoulsy 'Shutdown-VMGuest -VM $_.Name -Confirm:$false' 吗?

然后我认为你应该使用 PowerShell 后台作业在后台运行你的 Cmdlet。这样,您可以简单地在后台的所有 vm 上调用关闭 cmd,而无需等待关闭 cmdlet 完成。

以下是一些有用的链接:http: //blogs.technet.com/b/heyscriptingguy/archive/2012/12/31/using-windows-powershell-jobs.aspxhttp://msdn.microsoft.com/en-美国/图书馆/windows/desktop/dd878288(v=vs.85).aspx

问候。

于 2013-10-06T04:19:19.130 回答