Working with Windows PowerShell and Hyper-V Modules

by Nirmal Sharma

Discover how Windows PowerShell and the built-in PowerShell cmdlets that ship with Hyper-V can help automate a variety of server admin tasks on Hyper-V virtual machines.

Performing a set of common tasks manually in Windows may take a considerable amount of time and can quickly become taxing when the task is a repetitive necessity. For example, if you need to set the memory for ten virtual machines running on Hyper-V, you will need to use the Hyper-V Manager GUI and then edit the settings for all ten virtual machines.

Fortunately, Microsoft has to put a lot of effort into designing a common framework called PowerShell for scripting Windows components in an easy, straightforward manner.

Server TutorialsWindows PowerShell is as robust as unix shell and provides commands or cmdlets for almost all roles and features available on operating systems running Windows Server 2008 and later. With Windows PowerShell you can reduce the time and effort it takes to perform the same set of tasks such as the one illustrated above.

Hyper-V ships with 164 built-in PowerShell cmdlets. These cmdlets range from handling very simple, basic tasks to advanced ones such as live migrations of virtual machines across Hyper-V servers. To get the list of all the available Hyper-V cmdlets, you can use the following command in PowerShell:

  • Get-Command -Module Hyper-V

This command enumerates the list of Hyper-V cmdlets for both Hyper-V Server and any virtual machines and then shows in the command window as shown in the below screenshot:

PowerShell Tutorial - Screenshot 1

The PowerShell cmdlets are also user friendly. Just by looking at the name you can get a sense of what it is all about or you can at least get some idea about the command's functionality. For example, Add-VMNetworkAdapter, as shown in the above screenshot, is used to add a Vritual Machine Network Adaptor.

So if you are looking for a specific cmdlet out of 164 cmdlets, you can type the below command. Let's say you want to list all the cmdlets that have the word "Add" in it:

  • Get-Command -Module Hyper-V -Name *Add*

The command lists all cmdlets that have "Add" as shown in the below screenshot:

PowerShell Tutorial - Screenshot 2

Once you have found the cmdlet, you can use it to perform the tasks of your choice. If you are still unsure what a cmdlet does, you can always use "Get-Help <Hyper-V cmdlet>" cmdlet to get help and examples on the cmdlet.

There are three switches available to be used with "Get-Help" cmdlet: "-Examples", "-Detailed" and "-Full."

To get help and examples on a specific Hyper-V cmdlet called AddVMNetworkAdapter, you can type the following commands:

  • Get-Help Add-VMNetworkAdapter
  • Get-Help Add-VMNetworkAdapter -Examples
  • Get-Help Add-VMNetworkAdapter -Detailed
  • Get-Help Add-VMNetworkAdapter -Full

Cmdlet for Creating a Virtual Machine on Hyper-V

If you need to create a Virtual Machine on Hyper-V, you can use the New-VM cmdlet as listed below:

  • New-VM -Name MyVM -MemoryStartupBytes 1024MB -path C:\MyAllVMs

The above command creates a new virtual machine on Hyper-V with memory set to 1 GB (1024MB). Virtual machine configuration files and VHD files are stored in the C:\MyAllVMs folder as specified in the above command using the -path switch.

It is difficult to remember all the switches available with a PowerShell cmdlet. Of course, you can use the "Get-Help" cmdlet to get more help on the cmdlet, but there is another way to look at the same information in the PowerShell ISE GUI. To see the detailed help, type "Show-Command" in the PowerShell window. Typing "Show-Command" brings the GUI as shown in the below screenshot.

PowerShell Tutorial - Screenshot 3

In "Modules", select "Hyper-V" to filter all the Hyper-V cmdlets. Next type the name of the Hyper-V module to see the parameters/switches associated with it as shown in the above screenshot. If you are unsure of whether a cmdlet will work or not, you can always use the "WhatIf" parameter as shown in the red circle in the above image to actually test the command or get its result beforehand.

The "WhatIf" parameter is always added at the end of the cmdlet command. For example, to see if a new virtual machine will be created or not, you can test it before actually creating the virtual machine as shown in below screenshot:

PowerShell Tutorial - Screenshot 4

To manage virtual machines and their components every day, you can use the following PowerShell Hyper-V cmdlets examples. These cmdlets are very useful when performing common daily tasks such as modifying virtual machine network settings, adding virtual hard disks, exporting/importing virtual machines and so on for one or more Virtual Machines.

Tip: You can always add an asterisk (*) after the Virtual Machine name to let the cmdlet take action on all Virtual Machines starting with that name. For example, you can stop all Virtual Machines that start with the word "Exchange" as shown in the below example:

  • Stop-VM -Name Exchange*

If you need to export a Virtual Machine, use the Export-VM command as listed below:

  • Export-VM -Name VM1 -Path C:\Temp

To export all Virtual Machines on a Hyper-V (which is required if you are migrating all Virtual Machines from one Hyper-V Server to another Hyper-V Server), you can use the below command with the Get-VM cmdlet:

  • Get-VM | Export-VM -Path C:\AllVMs

The above command will export all the virtual machines including virtual machine configuration files and VHD files to the C:\AllVMs folder.

To move the Virtual Machine storage from one location to another, use the Move-VMStorage as shown in below example:

  • Move-VMStorage VM1 -DestinationStoragePath E:\AllVMs

The "Set-VM" cmdlet allows you to change the configuration of the Virtual Machine as shown in the below example:

  • Set-VM -Name VM1 -DynamicMemory -MemoryMinimumBytes 2GB -MemoryMaximumBytes 4GB -MemoryStartupBytes 1GB

To stop and start a Virtual Machine:

  • Start-VM -Name VM1
  • Stop-VM -Name VM1

To create snapshots of Virtual Machines, you can use the "Checkpoint-VM" cmdlet as detailed in the below example:

  • Checkpoint-VM -Name VM1 -SnapshotName BeforeChanges


There are a number of PowerShell cmdlets available for Hyper-V Server and virtual machines. You just need to search for the right cmdlet to help you accomplish your task.

In this article we learned how Windows PowerShell is closely integrated with Windows components such as Hyper-V role and how much easier PowerShell makes administrators' lives when it comes to performing daily maintaince tasks on Hyper-V virtual machines.

We also learned a new way to explore the help function for Hyper-V PowerShell cmdlets. The article also explained some of the common examples that are useful for the day-to-day administration of virtual machines running on a Hyper-V server.

Nirmal Sharma
is a MCSEx3, MCITP and Microsoft MVP in Directory Services. He has specialized in Microsoft Technologies since 1994 and has followed the progression of Microsoft Operating System and software. In his spare time, he likes to help others and share some of his knowledge by writing tips and articles on various sites and contributing to Solution IDs for www.Dynamic-SpotAction.com. Nirmal can be reached at nirmal_sharma@mvps.org.

Follow ServerWatch on Twitter and on Facebook

This article was originally published on Wednesday Jun 26th 2013
Mobile Site | Full Site