VMware Cloud Community
vin01
Expert
Expert
Jump to solution

restart-vmguest with while loop

I am trying to perform a restart-vmguest operation on a single vm and wait till restart is done. After that script will look for vmware tools GuestOperationsReady state and once its true then vm should shutdown and get the vm name. However the below script is not working its getting struck in a while loo. Can I get the proper way to perform the above explained operation.

$vm=Get-VM -Name TestVM01

$vmguestrestartstate=Restart-VMGuest -VM $vm.Name -Confirm:$false

while($vmguestrestartstate.State -eq 'Running'){

    sleep 2

$vmguestrestartstate.ExtensionData.UpdateViewData("Gueststate")

      }

while($vm.ExtensionData.Guest.GuestOperationsReady -ne "True"){

Start-Sleep -Seconds 3

$vm.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")

}

Stop-VMGuest -VM $vm -Confirm:$false

while($vm.PowerState -eq 'PoweredOn'){

sleep 2

$vm.ExtensionData.UpdateViewData("Runtime.Powerstate")

}

Get-VM $vm.Name |Select Name,Powerstate

Regards Vineeth.K
Reply
0 Kudos
1 Solution

Accepted Solutions
LucD
Leadership
Leadership
Jump to solution

You need to call UpdateViewData before you test on the value.

Otherwise, you will be testing on the old value.

$vm=Get-VM -Name 'Win2k16_Std_64bit-testClone'

Stop-VMGuest -VM $vm.Name -Confirm:$false

while($vm.ExtensionData.Runtime.PowerState -ne 'poweredOff'){

    Start-Sleep -Seconds 1

    $vm.ExtensionData.UpdateViewData("Runtime.Powerstate")

}


Start-VM -VM $vm.Name -Confirm:$false

$vm.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")

while($vm.ExtensionData.Guest.GuestOperationsReady -ne "True"){

    Start-Sleep -Seconds 1

    $vm.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")

}


Stop-VMGuest -VM $vm.Name -Confirm:$false

$vm.ExtensionData.UpdateViewData("Runtime.PowerState")

while($vm.ExtensionData.Runtime.PowerState -eq 'poweredOn'){

    Start-Sleep -Seconds 1

    $vm.ExtensionData.UpdateViewData("Runtime.Powerstate")

}

Get-VM $vm.Name | Select Name,Powerstate


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

View solution in original post

Reply
0 Kudos
8 Replies
LucD
Leadership
Leadership
Jump to solution

Can you try something like this

$vm=Get-VM -Name TestVM01

Restart-VMGuest -VM $vm -Confirm:$false


while($vm.ExtensionData.Runtime.PowerState -eq 'poweredOn'){

    Start-Sleep -Seconds 1

    $vm.ExtensionData.UpdateViewData('RunTime.PowerState')

}


while($vm.ExtensionData.Guest.GuestOperationsReady -ne "True"){

    Start-Sleep -Seconds 1

    $vm.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")

}


Stop-VMGuest -VM $vm.Name -Confirm:$false


while($vm.ExtensionData.Runtime.PowerState -eq 'poweredOn'){

    Start-Sleep -Seconds 1

    $vm.ExtensionData.UpdateViewData("Runtime.Powerstate")

}


Get-VM -VM $vm.Name | Select Name,Powerstate


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

Reply
0 Kudos
vin01
Expert
Expert
Jump to solution

I tried your script but after restart-vmguest completed the script never ends even though .ExtensionData.Guest.GuestOperationsReady is True

pastedImage_2.png

Regards Vineeth.K
Reply
0 Kudos
LucD
Leadership
Leadership
Jump to solution

My bad, a Restart-VMGuest does not power off the VM.

It will stay 'poweredOn' and consequently eternally in the 1st while-loop.

The better solution would be:

- do a Stop-VMGuest

- wait till the VM is powered off

- power on the VM

- wait till GuestOperationsRead is $true

- do a Stop-VMGuest

- wait till the VM is powered off


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

Reply
0 Kudos
vin01
Expert
Expert
Jump to solution

Actually my original intention of using  Restart-VMGuest is on the template vms which I am going to execute are pending restart for windows updates. So I am trying to restart and let the windows apply the patches and start the machine back. Once the machine start back and GuestOperationsRead is $true then I will do the guest stop.

I am not sure Stop-VMGuest will work on this scenario. Will it work if I do Stop-VMGuest and start it back?

Regards Vineeth.K
Reply
0 Kudos
LucD
Leadership
Leadership
Jump to solution

Yes, those patches will be applied during the shutdown


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

Reply
0 Kudos
vin01
Expert
Expert
Jump to solution

I have tested like this but its failing to do stop again. I think ExtensionData.UpdateViewData is not updating Guest.GuestOperationsReady value.

Anything wrong in this lines.

$vm=Get-VM -Name 'Win2k16_Std_64bit-testClone'

Stop-VMGuest -VM $vm.Name -Confirm:$false

while($vm.ExtensionData.Runtime.PowerState -eq 'poweredOn'){

    Start-Sleep -Seconds 1

    $vm.ExtensionData.UpdateViewData("Runtime.Powerstate")

}

Start-VM -VM $vm.Name -Confirm:$false

while($vm.ExtensionData.Guest.GuestOperationsReady -ne "True"){

    Start-Sleep -Seconds 1

    $vm.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")

}

Stop-VMGuest -VM $vm.Name -Confirm:$false

while($vm.ExtensionData.Runtime.PowerState -eq 'poweredOn'){

    Start-Sleep -Seconds 1

    $vm.ExtensionData.UpdateViewData("Runtime.Powerstate")

}

Get-VM $vm.Name | Select Name,Powerstate

pastedImage_0.png

Regards Vineeth.K
Reply
0 Kudos
LucD
Leadership
Leadership
Jump to solution

You need to call UpdateViewData before you test on the value.

Otherwise, you will be testing on the old value.

$vm=Get-VM -Name 'Win2k16_Std_64bit-testClone'

Stop-VMGuest -VM $vm.Name -Confirm:$false

while($vm.ExtensionData.Runtime.PowerState -ne 'poweredOff'){

    Start-Sleep -Seconds 1

    $vm.ExtensionData.UpdateViewData("Runtime.Powerstate")

}


Start-VM -VM $vm.Name -Confirm:$false

$vm.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")

while($vm.ExtensionData.Guest.GuestOperationsReady -ne "True"){

    Start-Sleep -Seconds 1

    $vm.ExtensionData.UpdateViewData("Guest.GuestOperationsReady")

}


Stop-VMGuest -VM $vm.Name -Confirm:$false

$vm.ExtensionData.UpdateViewData("Runtime.PowerState")

while($vm.ExtensionData.Runtime.PowerState -eq 'poweredOn'){

    Start-Sleep -Seconds 1

    $vm.ExtensionData.UpdateViewData("Runtime.Powerstate")

}

Get-VM $vm.Name | Select Name,Powerstate


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

Reply
0 Kudos
vin01
Expert
Expert
Jump to solution

Thanks Working Now.

Regards Vineeth.K
Reply
0 Kudos