In past few days I worked with Microsoft Hyper-V and PowerShell as part of my study for updating my certificate and during this study time, I made few simple scripts which can be used in lab.
Mass linked VHD/VHDX creator
This script will create multiple VHD/VHDX file based on provided info of currently existed “Differencing” VHD/VHDX file; so later they can be attached to the VMs and so on.
[crayon title=”Mass linked VHD/VHDX (Ver 0.1)”]# Created by: Sohrab Kasraeian Fard
Mass linked VHD/VHDX (Ver 0.1)
CLS
$vhdpath = Read-Host “Provide parent VHD/VHDX file path”
$vhddest = Read-Host “Where should new VHD/VHDX saved”
$vhdnasc = Read-Host “Provide naming schema for new VHD/VHDX”
$vhdtype = Read-Host “VHD or VHDX”
$vhdqty = Read-Host “How many VHD/VHDX should be created/linked”
$target = “”
for ($i=1; $i -le $vhdqty; $i++) {
$target = “$vhddest” + “$vhdnasc” + “$i” + “.” + “$vhdtype”
New-VHD -ParentPath $vhdpath -Differencing -Path $target
}[/crayon]
Adding multiple virtual switches
This script will get naming schema and will build multiple virtual switches based on that
[crayon title=”Mass vSwitch Creator (Ver 0.1)”]# Created by: Sohrab Kasraeian Fard
Mass vSwitch Creator (Ver 0.1)
CLS
$vSwitchType = “Private” #Possible type are Private,External,Internal
$Note = “Test Only vSwitches” #Enter any note for vSwitch
$Name = “vSw01″,”vSw02″,”vSw03″,”vSw04″,”vSw05″,”vSw06” #List new virtual switches
$Name | %{New-VMSwitch -Name $_ -SwitchType $vSwitchType -Notes $Note -Confirm:$false}[/crayon]
Adding multiple VMs
This script will help to create multiple VMs by getting some basic info, creating “Differencing” VHD/VHDX based on pre-created/pre-configured OS, adding them to VMs and configuring them.
[crayon title=”Mass Linked VMs (Ver 0.1)”]# Created by: Sohrab Kasraeian Fard
CLS
Write-Host “Mass Linked VMs (Ver 0.1)nThis script would create new linked VMs for lab usage.
n”
$VMNameTemp = Read-Host “Specify VM name template”
$VMQty = Read-Host “How many VMs should be created”
Get-VMSwitch | select Name,SwitchType
$vSwitch = Read-Host “`nWhich vSwitch new VMs should connect to (full or part of vSwitch name)”
$Switch = Get-VMSwitch | where {$_.name -like “*$vSwitch*”}
$Switch
$VHDpath = Read-Host “`nProvide parent vhd file path”
$VHDdest = Read-Host “Where should new vhd saved”
$VHDtype = Read-Host “vhd or vhdx”
$target = “”
for ($i=1; $i -le $VMQty; $i++) {
$target = “$VHDdest” + “$VMNameTemp” + “$i” + “.” + “$VHDtype”
New-VHD -ParentPath $VHDpath -Differencing -Path $target
}
for ($i=1; $i -le $VMQty; $i++) {
$Name = “$VMNameTemp” + “$i”
$VHDP = “$VHDdest” + “$VMNameTemp” + “$i” + “.” + “$VHDtype”
$VMCD = Get-date -DisplayHint DateTime
New-VM -Name $Name -VHDPath $VHDP -MemoryStartupBytes 256MB -SwitchName $Switch.Name -BootDevice IDE | Set-VM -ProcessorCount 2 -DynamicMemory:$true -Notes “$Name created on $VMCD” -MemoryMinimumBytes 384MB -MemoryMaximumBytes 512MB -MemoryStartupBytes 512MB
Write-Host “`n”
}[/crayon]
[crayon title=”Mass Linked VMs (Ver 0.2)”]# Created by: Sohrab Kasraeian Fard
CLS
Write-Host “Mass Linked VMs (Ver 0.2)nThis script would create new linked VMs for lab usage
n”
############# Basic info #############
$VMNameTemp = Read-Host “Specify VM name template”
$VMQty = Read-Host “How many VMs should be created”
############# Virtual Switch Selection #############
Get-VMSwitch | select Name,SwitchType
$vSwitch = Read-Host “nWhich vSwitch new VMs should connect to (full or part of vSwitch name)"
“$($Switch.Name)
$Switch = Get-VMSwitch | where {$_.name -like "*$vSwitch*"}
Write-Host "" has been selected as target virtual switch
n”
############# VHD/VHDX Config #############
#$VHDpath = Read-Host “`nProvide parent vhd file path” # like: F:\MS vLab\Base\LIBRARY.vhdx
$VHDpath = “F:\MS vLab\Base\LIBRARY.vhdx” # “Provide path to VHD/VHDX file, like: F:\MS vLab\Base\LIBRARY.vhdx”
#$VHDdest = Read-Host “Where should new vhd saved” # like: F:\MS vLab\Test\
$VHDdest = “F:\MS vLab\Test\” # “Provide path for saving new VHD/VHDX, like: F:\MS vLab\Test\”
$PD = Get-VHD $VHDpath
if ($PD.VhdFormat -eq “VHDX”) {
Write-Host “Parent disk is in VHDX format, the child could be VHDX”
$VHDtype = “vhdx”
} elseif ($pd.VhdFormat -eq “VHD”) {
Write-Host “Parent disk is in VHDX format, the child could be VHD”
$VHDtype = “vhd”
}
$target = “”
for ($i=1; $i -le $VMQty; $i++) {
$target = “$VHDdest” + “$VMNameTemp” + “$i” + “.” + “$VHDtype”
$dskrst = New-VHD -ParentPath $VHDpath -Differencing -Path $target
if ($dskrst) {
Write-Host “New Disk "$("$VMNameTemp" + "$i" + "." + "$VHDtype")
” has been created”
} else {
Write-Host “No new disk has been created!”
}
}
############# VM Config would be applied after creation #############
$CPUQty = Read-Host “nHow many vCPU VMs should have"
“VMCD`” would add date of VM creation as note)”
#$CPUQty = 2
$MinMemB = 256MB # MemoryMinimumBytes in MB/GB
$MaxMemB = 384MB # MemoryMaximumBytes in MB/GB
$SupMemB = 256MB # MemoryStartupBytes in MB/GB
$Note = Read-Host "Provide note for VMs (
#$Note = “$Name created on $VMCD” #It’s possible to replace this note with static note for all VMs
Write-Host “”
for ($i=1; $i -le $VMQty; $i++) {
$Name = “$VMNameTemp” + “$i”
$VHDP = “$VHDdest” + “$VMNameTemp” + “$i” + “.” + “$VHDtype”
$result = New-VM -Name $Name -VHDPath $VHDP -MemoryStartupBytes $SupMemB -SwitchName $Switch.Name -BootDevice IDE
if ($result) {
Write-Host “New VM "$($result.Name)
” is created successfuly.”
if ($Note -eq “VMCD”) {
$VMCD = Get-date -DisplayHint DateTime
$Note = “$($VMCD)”
}
Set-VM -Name $result.Name -ProcessorCount $CPUQty -DynamicMemory:$true -Notes $Note -MemoryMinimumBytes $MinMemB -MemoryMaximumBytes $MaxMemB -MemoryStartupBytes $SupMemB
} else {
Write-Host “No VM has been created!”
}
}[/crayon]
I’m working on “Mass vSwitch Creator (Ver 0.1)” to make it easier and more friendly and in the end, the update would be posted here.
Download
Mass linked VHD-VHDX (Ver 0.1)
Mass vSwitch Creator (Ver 0.1)
Mass Linked VMs (Ver 0.1)
Mass Linked VMs (Ver 0.2)
Screenshots
Below are four screenshots from “Mass Linked VMs (Ver 0.2)” script