Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Let's use this article to provide quick Hyper-V tasks in PowerShell.
Get a list of virtual machines on a Hyper-V parent
# This can be run locally or against a remote parent. Use "." for local
$VMs = gwmi MSVM_ComputerSystem -computer "<computername>" -namespace "root\virtualization"
ForEach ( $vm in $VMs) {
if ($vm.name -ne $vm.elementname) { #skip the parent's name
$vm .elementname
}
}
From the above, we can see that the list of $VMs is a list of objects. To get an object for an individual VM, we can go use:
$vm = Get-WMIObject MSVM_ComputerSystem -namespace root\virtualization -filter "ElementName = 'vmname' "
To start a VM we need to change its EnabledState to "2". So:
$vmName = $args[0]
if (! $vmName ) {
$vmName = read-host "Which Virtual Machine do you wish to start? "
}
$vm = gwmi -namespace root\virtualization Msvm_ComputerSystem -filter "ElementName='$vmName' "
if ( $vm.EnabledState -eq 2 ) {
write-host "The virtual machine $vmName is already running."
} else {
$vm .RequestStateChange(2)
}
Shutdown a single virtual machine on the local parent
# Shutdown a virtual machine. Based on initial idea from Tony Soper.
# Expects a VM name as an argument, or prompts for the name.
$vmName = $args[0]
if (! $vmName ) {
$vmName = read-host "Which Virtual Machine do you wish to shut down?"
}
write-host "Shutting down $vm for system maintenance"
# Get the VM by name and request state to change to Enabled
$vm = gwmi -namespace root\virtualization Msvm_ComputerSystem -filter "ElementName='$vmName'"
# Get the associated Shutdown Component
$shutdown = gwmi -namespace root\virtualization -query "Associators of {$vm} where ResultClass=Msvm_ShutdownComponent"
if (! $shutdown ) {
write-host "Virtual machine $vmName is already shut down."
} else {
# Initiate a forced shutdown with simple reason string, return resulting error code
return $shutdown.InitiateShutdown($true,"System Maintenance")
}
To Create a VHD:
$vhdsvc = gwmi -class "Msvm_ImageManagementService" -name root\virtualization
$DynVHD = $vhdsvc.CreateDynamicVirtualHardDisk("E:\Test\Test-Sys.vhd", 120GB) #Create 120Gb Dynamic VHD
$FixedVHD = $vhdsvc.CreateFixedVirtualHardDisk("E:\Test\Test-Data.vhd",40GB) #Create 40GB Fixed VHD
$vhdJob = [wmi]$FixedVHD.job # Job Status for creating the VHD
For more Hyper-V powerShell scripts, such as List virtual machines in a hyper-v host cluster Seehttp://social.technet.microsoft.com/wiki/contents/articles/hyper-v-scripts.aspx
A really useful module for use with Hyper-V and PowerShell is on CodePlex at: http://pshyperv.codeplex.com/