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”.

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;
}

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';
}

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.

This article has 2 comments

  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: