Starting Hyper-V virtual machines in sequence

This post describes a simple approach for scripting the startup of multiple Hyper-V virtual machines in sequence.


I do a lot of work with virtualized environments with Hyper-V virtual machines running in a Windows client operating system. I'll often have multiple VMs per environment, with startup dependencies between them. For example, a Team Foundation Server environment using domain authentication and a separate database tier will require 3 VMs, one for Active Directory, one for the SQL Server database, and one for the TFS application tier.

To serialize the startup of these virtual machines and ensure they start in a specific order, I've created the following PowerShell script:

 [CmdletBinding()]
Param(
    [Parameter(Position=0)]
    [array]$list = @("AD", "SQL", "TFS")
)

$start = Get-Date
Write-Output "$(Get-Date $start -Format g) => Starting the following VMs: $list"

foreach ($item in $list)
{
    $name = "HV-DEMO-" + $item
    Write-Output ""
    Write-Output "Starting VM: $name"
    Start-VM -Name $name
    Write-Output "Waiting for heartbeat..."
    Wait-VM -Name $name -For Heartbeat
    Write-Output "VM $name started and accepting connections"
}

$finish = Get-Date
Write-Output "$(Get-Date $finish -Format g) => Finished in $(($finish - $start).Minutes) minutes $(($finish - $start).Seconds) seconds"

Saving this script to a local file named "start-tfs-vms.ps1" and then running it with no parameters (uses the default parameter values) displays the following output:

   
 Windows PowerShell
 Copyright (C) Microsoft Corporation. All rights reserved.

 PS C:\> start-tfs-vms.ps1
 1/9/2018 6:11 PM => Starting the following VMs: AD SQL TFS

 Starting VM: HV-DEMO-AD
 Waiting for heartbeat...
 VM HV-DEMO-AD started and accepting connections

 Starting VM: HV-DEMO-SQL
 Waiting for heartbeat...
 VM HV-DEMO-SQL started and accepting connections

 Starting VM: HV-DEMO-TFS
 Waiting for heartbeat...
 VM HV-DEMO-TFS started and accepting connections

 1/9/2018 6:11 PM => Finished in 0 minutes 42 seconds  

You can easily create another script named "stop-tfs-vms.ps1" that replaces usage of the Start-VM cmdlet with the Stop-VM cmdlet to reverse this operation. Note that you will probably want to change the order of the VM names so they stop in the reverse order.