以下是场景 - 我通过 Powershell/PowerCLI(VMwares Powershell 模块)远程启动虚拟机,一旦虚拟机启动,我将针对虚拟机运行一系列 cmdlet。
目前我有这段代码:
Start-VM "my VM Name" -runAsync
$vm = Get-VM | where { $_.name -eq "my VM Name" }
start-sleep -seconds 20
do {
start-sleep -seconds 5
$toolsStatus = ($VM | Get-View).Guest.ToolsStatus
} until ($toolsStatus -eq 'toolsOK')
哪个有效 - 虚拟机启动,循环将进行检查,直到 VMware Tools 向 VMware 报告(这意味着虚拟机已完全启动到操作系统)。
然而,这将无限期地运行,因此在虚拟机无法成功启动的情况下 - 脚本会挂起。因此,我尝试添加一个计时器,以便在脚本运行超过 5 分钟时退出脚本:
Start-VM "My VM Name" -runAsync
$VM = Get-VM | where { $_.name -eq "My VM Name" }
$timeout = new-timespan -minutes 5
start-sleep -seconds 5
$toolsStatus = ($VM | Get-View).Guest.ToolsStatus
$sw = [diagnostics.stopwatch]::StartNew()
while ($sw.elapsed -lt $timeout) {
if ($toolsStatus -eq 'toolsOK') {
return
}
start-sleep -seconds 5
}
Exit
5 分钟后成功退出脚本。问题是,当我测试这个时 - 虚拟机已启动,我收到一条响应,表明 VMtools 已响应,但循环并未停止。它会继续,直到超时,然后退出,而不是继续下一步。
我以前没有使用过这种类型的循环,所以希望得到一些输入,因为我确信我已经接近了 - 但我错过了一些东西。
应该只是一个简单的逻辑修复。在你的决赛中while
循环,将两个表达式相加-and
并否定$toolStatus
while ($sw.elapsed -lt $timeout -and $toolsStatus -ne 'toolsOK'){
start-sleep -seconds 5
}
当其中一个变为假时,循环将结束。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)