It’s been a while… been a while since I blogged and I’m ashamed to say been a while since I scripted! But there is nothing like a crisis to bring out the scripting guns when we had to restart a 100 odd virtual machines which were hung. Which made me realize that while I had the script already made, I hadn’t made a post about it. So here it is, and hope it would be useful for you as it was for me!
In all of these commands I will use -Confirm:$False at the end. Confirm:$false is used to disregard the Confirmation prompt that PowerCLI gives out. It’s an optional parameter that is useful if you’re executing this for bulk VMs
Restart VMs with PowerCLI
The command to gracefully restart a VM from the Guest OS – which is to say to send a restart command to the guest operating system and let it do its thing – is the following :
Restart-VMGuest -VM <VM_name> -Confirm:$False
This command is useful if you prefer to let the OS gracefully restart itself after, say, a memory or CPU upgrade.
*VM Tools is required for this command to work because the vCenter API has to communicate with the OS for the command to execute.

Reset VMs with PowerCLI
The command to reset a VM – which is pretty much like pressing the physical reset button to restart the system – is the following :
Restart-VM -VM <VM_name> -Confirm:$False
This command is useful if the VM is hung or unresponsive and resetting it is the only option you have left.

Shutdown VMs with PowerCLI
The command to gracefully shutdown a VM from the Guest OS – which is to say to send a shutdown command to the guest operating system and let it do its thing – is the following :
Shutdown-VMGuest -VM <VM_name> -Confirm:$False
This command is useful if you prefer to let the OS gracefully shut itself down during, for example, a downtime.
*VM Tools is required for this command to work because the vCenter API has to communicate with the OS for the command to execute.

Power Off VMs with PowerCLI
The command to forcefully power off a VM – which is pretty much like yanking the power cable off a server (or less violently powering off by pressing the power button) – is the following :
Stop-VM -VM <VM_name> -Confirm:$False
This command is useful you want the VMs shut down as quickly as possibly or if its unresponsive.

Putting it all together to a script for executing on bulk VMs
The above commands are to execute on one VM, lets see how we can use them to create a full fledged script.
Long term followers of the blog will know that I like to put the list of VMs for the script to be executed on in a text file and import the list via the text file to the script – read all about it here. The reason I do this is that it’s easier to change the VM list later on which increases the reusability of the script.
Lets see how we can put together a script to reset a list of VMs which I assume is contained in a text file called “vmlist.txt”
$vm_list = Get-Content "vmlist.txt" #txt file with the vm list
$vcenter = "<vcenter_name>"
Connect-VIServer $vcenter
foreach ($vm in $vm_list){
Restart-VM -VM <VM_name> -Confirm:$False #<replace this with any of the above commands to suit your need>
}
Disconnect-VIServer -Confirm:$false
To change between restart, reset, shutdown or power off – change the line Restart-VM… with the command you want.
That is it! As easy as that!
It makes me feel validated & boosts my ego if you share, comment if you found this useful (no pressure 😉 ). Social media links are below!
And as always, Happy scripting!