Powershell并行和串行操作

时间:2013-10-04 20:24:08

标签: powershell powercli

我正在使用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
        }
}

提前致谢!

2 个答案:

答案 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.aspxhttp://msdn.microsoft.com/en-us/library/windows/desktop/dd878288(v=vs.85).aspx

问候。