【问题标题】:VM power state not updated and returned correctly虚拟机电源状态未更新并正确返回
【发布时间】:2020-08-09 21:40:53
【问题描述】:

我正在尝试启动之前使用 PowerCLI 关闭的虚拟机。
当我尝试运行以下脚本(更大脚本的一部分)时,我仍然得到一个不是“PoweredOn”的状态,即使我可以在 VSphere 控制台上看到机器已打开电源。
我在其他情况下也遇到了这个问题,我尝试重新获得虚拟机,但我无法完成这项工作。
如果我不重新获取虚拟机,我有时会收到错误消息,声称我所指的虚拟机为空。 我究竟做错了什么?我错过了什么?
以下是脚本行:

$VMs = get-vm | Where-object {($_.Name -like $vmNamePatternToSearch)}# | Out-Null
foreach ($vm in $VMs) {
    #$vm = Get-VM -Name $vm.Name #| Out-Null
    if ($vm.powerstate -ieq "poweredoff") {
        Start-VM -VM $vm -Confirm:$False | Out-Null
        Write-Host -NoNewline 'Powering On' $vm.Name.ToString().PadRight(22)
        do {
            Start-Sleep -Seconds 1
            Write-Host -NoNewline '|' $vm.powerstate
        } until ($vm.powerstate -ieq "PoweredOn")
        Write-Host
    }
}

所以我的输出是“| PoweredOff| PoweredOff| PoweredOff| PoweredOff| PoweredOff|...”
即使机器已经启动。
即使我取消注释“#$vm = Get-VM -Name $vm.Name #| Out-Null”行 - 仍然不行。

非常感谢您的意见。

谢谢!

【问题讨论】:

    标签: powercli


    【解决方案1】:

    PowerShell 的对象是时间点引用。因此,您的 vm 变量将继续反映您运行 get-vm cmdlet 时 VM 的状态。

    为了帮助克服这个问题,您可以运行类似以下的内容来在循环期间引用 VM 的更新状态:

            do {
                Start-Sleep -Seconds 1
                Write-Host -NoNewline '|' $vm.powerstate
            } until ((Get-VM $vm).powerstate -ieq "PoweredOn")
    

    【讨论】:

    • 谢谢凯尔。您的回答既是一个解决方案,也是我很高兴了解到的重要信息。我将您的解决方案整合到脚本中,现在我可以关闭开机的机器,将它们恢复为快照,并高效地启动它们并匹配 VSHere 事件日志。每次读取状态都需要一段时间,但那些电源操作反正很长,所以没什么大不了的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 2020-06-29
    • 2020-07-18
    相关资源
    最近更新 更多