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
You need to call UpdateViewData before you test on the value.
Otherwise, you will be testing on the old value.
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
Can you try something like this
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
I tried your script but after restart-vmguest completed the script never ends even though .ExtensionData.Guest.GuestOperationsReady is True
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
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?
Yes, those patches will be applied during the shutdown
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
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
You need to call UpdateViewData before you test on the value.
Otherwise, you will be testing on the old value.
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
Thanks Working Now.