Looking for a method to restart a non-persistent environment in ESXi or vCenter, I was able to use PowerCLI to issue the commands needed. Originally I was looking to automate the recovery of a snapshot when it dawned on me that a non-persistent disk would facilitate the same thing. However I would need to power off the server and back on again for it to work.
And this is what came from my searching and trial and error
Powering Off
Connect-VIServer -Server 1.1.1.1 # Get All the ESX Hosts $ESXSRV = Get-VMHost # For each of the VMs on the ESX hosts Foreach ($VM in ($ESXSRV | Get-VM)){ # Shutdown the guest cleanly $VM | Shutdown-VMGuest -Confirm:$false } # Set the amount of time to wait before forcing power off $waittime = 300 #Seconds $Time = (Get-Date).TimeofDay do { # Wait for the VMs to be Shutdown sleep 1.0 $timeleft = $waittime - ($Newtime.seconds) $numvms = ($ESXSRV | Get-VM | Where { $_.PowerState -eq "poweredOn" }).Count Write "Waiting for shutdown of $numvms VMs or until $timeleft seconds" $Newtime = (Get-Date).TimeofDay - $Time } until ((@($ESXSRV | Get-VM | Where { $_.PowerState -eq "poweredOn" }).Count) -eq 0 -or ($Newtime).Seconds -ge $waittime) Write-Host "Shutdown Complete"
Powering On
Connect-VIServer -Server 1.1.1.1 # Get All the ESX Hosts $ESXSRV = Get-VMHost # For each of the VMs on the ESX hosts Foreach ($VM in ($ESXSRV | Get-VM)){ # Shutdown the guest cleanly $VM | Start-VM } Write-Host "Startup Complete"
Both – Power Off wait then Power On
Connect-VIServer -Server 1.1.1.1 # Get All the ESX Hosts $ESXSRV = Get-VMHost # For each of the VMs on the ESX hosts Foreach ($VM in ($ESXSRV | Get-VM)){ # Shutdown the guest cleanly $VM | Shutdown-VMGuest -Confirm:$false } # Set the amount of time to wait before forcing power off $waittime = 300 #Seconds $Time = (Get-Date).TimeofDay do { # Wait for the VMs to be Shutdown sleep 1.0 $timeleft = $waittime - ($Newtime.seconds) $numvms = ($ESXSRV | Get-VM | Where { $_.PowerState -eq "poweredOn" }).Count Write "Waiting for shutdown of $numvms VMs or until $timeleft seconds" $Newtime = (Get-Date).TimeofDay - $Time } until ((@($ESXSRV | Get-VM | Where { $_.PowerState -eq "poweredOn" }).Count) -eq 0 -or ($Newtime).Seconds -ge $waittime) Write-Host "Shutdown Complete" #For each of the VMs on the ESX hosts Foreach ($VM in ($ESXSRV | Get-VM)){ # Shutdown the guest cleanly $VM | Start-VM } Write-Host "Startup Complete"
Next was to use a batch file to run a task to execute the PowerCLI commands. This was done by doing the following set as a scheduled task
C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe -psconsolefile "C:\Program Files\VMware\Infrastructure\vSphere PowerCLI\vim.psc1" -noexit -command c:\scripts\script_name_goes_here.ps1
Thanks Hristo for your help