PS without BS: Creating VMs in Hyper-V with PowerShell

Of all the things that sometimes drill me is having to do a web search for PowerShell cmdlets, and seems too often I am just looking for how to use a cmdlet, and after 10 pages of text, you ask yourself, how do I use this cmdlet again? :)

So it's my hope to promote solutions on my blogs, and allow others to use (or plagiarize them) as needed.

Today? The creation of VMs in PowerShell. This is a 2 part solution which uses a batch file to call a PowerShell script. Why? Because I love variables, and once and done solutions.

Here's how:
Step 1: Create a newvm.ps1 file
Here's the PowerShell:
Param(
[Parameter(Mandatory=$true)][string]$vmHost,
[Parameter(Mandatory=$true)][string]$vmName,
[Parameter(Mandatory=$true)][string]$vmPath,
[Parameter(Mandatory=$true)][string]$vmSwitch,
[Parameter(Mandatory=$true)][long]$vmMemoryStartup,
[Parameter(Mandatory=$true)][long]$vmNewDiskSize,
[Parameter(Mandatory=$true)][string]$vmMACEnd)

New-VM -ComputerName $vmhost -Name $vmName -Generation 2 -Path $vmPath\$vmName -SwitchName $vmSwitch -BootDevice NetworkAdapter -MemoryStartupBytes $vmMemoryStartup -NewVHDPath $vmPath\$vmname\$vmName.vhdx -NewVHDSizeBytes $vmNewDiskSize
Set-VMNetworkAdapter -ComputerName $vmHost -vmName $vmName -StaticMacAddress $vmMACEnd
Add-VMDvdDrive -VMName $vmName

Step 2: Create the batch file (newvm.bat)
Assumptions

  • HOST1 is your Hyper-V host
  • You are creating VMs DC01 and DC02
  • The switch you are using is called MySwitch and that it is already created.
  • You will be storing the VMs themselves in D:\VM (and then a folder called DC01 and DC02, respectively).
  • You will be setting status MAC assignments ending in 01 and 02, respectively

@echo off
powershell -file .\newvm.ps1 -vmhost "HOST2" -vmName "DC01" -vmPath "D:\VM" -vmSwitch "MySwitch" -vmMemoryStartup 1073741824 -vmNewDiskSize 42949672960 -vmMACEnd CC:CC:CC:CC:CC:01"
powershell -file .\newvm.ps1 -vmhost "HOST2" -vmName "DC02" -vmPath "D:\VM" -vmSwitch "MySwitch" -vmMemoryStartup 1073741824 -vmNewDiskSize 42949672960 -vmMACEnd "CC:CC:CC:CC:CC:02"

Clarifications on Memory Startup and Disk Space:
This is calculated in bytes - so for example: 1GB is 1024*1024*1024. 2GB would be 1024*1024*1024*2. Below is a quick list:

Memory:
1GB: 1073741824
2GB: 2147483648
4GB: 4294967296
8GB: 8589934592

Disk:
40GB: 42949672960
300GB: 322122547200

Hope you did find this useful and it helps accelerate your productivity in PowerShell.

-- If you like my blogs, please share it on social media, rate it, and/or leave a comment. --