Start and Save Hyper-V VMs with PowerShell

I use Windows 8 or Windows Server 2012 R2 on most of my local workstations between home and work. In order to conserve memory, I turn my Hypver-V lab environments on and off as I need them. Given that my smallest environment is a grouping of five virtual machines (VMs), I quickly got tired of all of the clicks necessary to start up all of the machines, in order, or save them all when I was done.

To solve this problem, I wrote the below functions in PowerShell and added them to my Windows PowerShell Profile. These functions take advantage of the Hyper-V module, available in Windows 8 and above or Windows 2012 and above. There are over 160 Cmdlets to pick from. In this post we will only demonstrate two, Start-VM and Save-VM.

Functions

It is important to run the Hyper-V cmdlets in a PowerShell session that is running “As Administrator”.

[sql]function Start-MyVMs
{
#start AD VM
Start-VM ‘v-hammer-ad’;

#start SQL VMs
$SqlVms = @(‘v-hammer-01′,’v-hammer-02’,
‘v-hammer-03′,’v-hammer-04’);
$jobs = @();
foreach($VM in $SqlVms)
{
$args = @($VM);
$jobs += Start-Job -ScriptBlock { Start-VM $args[0] } `
-ArgumentList $args;
}

$jobs | Wait-Job | Receive-Job | Remove-Job;
}[/sql]

[sql]function Save-MyVMs
{
#Save SQL VMs
$SqlVms = @(‘v-hammer-01′,’v-hammer-02’,
‘v-hammer-03′,’v-hammer-04’);
$jobs = @();
foreach($VM in $SqlVms)
{
$args = @($VM);
$jobs += Start-Job -ScriptBlock { Save-VM $args[0] } `
-ArgumentList $args;
}

$jobs | Wait-Job | Receive-Job | Remove-Job;

#Save AD VM
Save-VM ‘v-hammer-ad’;
}[/sql]

Quick overview

In this particular lab environment I have an Active Directory server with four VMs joined to the domain. This is an environment that I use to run tests on a SQL Server Availability Group configuration.

I’ve decided that I want my VMs to start and be saved with the AD VM online at all times. I also don’t want to have to wait for each one to start or save individually. To accomplish these goals I’ve used the Start-VM and Save-VM cmdlets for V-HAMMER-AD by themselves. I then used the Start-Job cmdlet to spawn asynchronous jobs. These jobs run in parallel and bring the remaining SQL VMs up as fast as my hardware will allow. Then I wait for the jobs to complete (Wait-Job), output the error or information messages to my console (Receive-Job), and dispose of the jobs (Remove-Job).

Since these have been added to my profile, every time I open a PowerShell console window the functions are loaded and a single cmdlet manages my lab environment’s state.


Posted

in

,

by

Tags:

Comments

2 responses to “Start and Save Hyper-V VMs with PowerShell”

  1. […] favorite use for the PowerShell profiles is to load custom functions and aliases. I once blogged about a couple of functions that I use to start and save virtual machines with Hyper-V. I put these […]

  2. […] favorite use for the PowerShell profiles is to load custom functions and aliases. I once blogged about a couple of functions that I use to start and save virtual machines with Hyper-V. I put these […]

Leave a Reply

%d bloggers like this: