Hi, Powershell script to create a VM after prompting the user for various settings. The script then attaches an ISO which is a boot media for an MDT server that is built tp push a particular task sequence resulting in a failry automated VM deployment. I normally do this type of stuff with VMM etc but the client only has Hyper-V and wanted it automated as much as possible.
$VMName = Read-Host "Enter VM Name (Press [Enter] to choose Server01)"
if ($VMName -eq "")
{
$VMName="Server01"
} ;
if ($VMName -eq $NULL)
{
$VMName="Server01"
}$StartupMem = Read-Host "Enter VM Startup Memory in GB’s (Press [Enter] to choose 1GB)"
if ($StartupMem -eq "")
{
$StartupMem=1024MB
} ;
if ($StartupMem -eq $NULL)
{
$StartupMem=1024MB
}
if ($StartupMem -ne 1024MB)
{
$StartupMem=[int]$StartupMem * 1073741824
}$MinimumMem = Read-Host "Enter VM Minimum Memory in GB’s (Press [Enter] to choose 512MB)"
if ($MinimumMem -eq "")
{
$MinimumMem=512MB
} ;
if ($MinimumMem -eq $NULL)
{
$MinimumMem=512MB
}
if ($MinimumMem -ne "512MB")
{
$MinimumMem=[int]$MinimumMem * 1073741824
}$MaximumMem = Read-Host "Enter VM Maximum Memory in GB’s (Press [Enter] to choose 4GB)"
if ($MaximumMem -eq "")
{
$MaximumMem=4096MB
} ;
if ($MaximumMem -eq $NULL)
{
$MaximumMem=4096MB
}
if ($MaximumMem -ne 4096MB)
{
$MaximumMem=[int]$MaximumMem * 1073741824
}do
{
$Storage = Read-Host "Which storage do you want, SATA ‘D’ or SSD ‘H’ (Press [Enter] to choose ‘D’)"
if ($Storage -eq "")
{
$Storage="D"
} ;
if ($Storage -eq $NULL)
{
$Storage="D"
}
if (($Storage -ne "D") -and ($Storage -ne "H"))
{
Write-Host "Incorrect valude entered, please enter ‘D’ or ‘H’"
}
}
until ($Storage -eq "D" -or $storage -eq "H")
$VDisk1 = Read-Host "Enter VM System (C:) Hard Drive in GB’s (Press [Enter] to choose 60GB)"
if ($VDisk1 -eq "")
{
$VDisk1=60GB} ; if ($VDisk1 -eq $NULL){$VDisk1=60GB
}
if ($VDisk1 -ne 60GB)
{
$VDisk1=[int]$VDisk1 * 1073741824
}$VDisk2 = Read-Host "Enter VM Data (D:) Hard Drive in GB’s (Press [Enter] to choose 60GB)"
if ($VDisk2 -eq "")
{
$VDisk2=60GB} ; if ($VDisk2 -eq $NULL){$VDisk2=60GB
}
if ($VDisk2 -ne 60GB)
{
$VDisk2=[int]$VDisk2 * 1073741824
}$VMSwitches = @(get-vmswitch)
#clear variable for testing
$VMSwitch = ""
$VMNetwork = ""do
{
For($i = 0; $i -le $VMSwitches.GetUpperBound(0);$i++)
{
Write-Output (("Enter ‘" + ($i+1) + "’ for Virtual Switch:") + ($VMSwitches[$i].Name))
}
$VMSwitch = Read-Host "Choose a switch"
$VMNetwork = ($VMSwitches[$VMSwitch-1].Name)
if (($VMNetwork -eq "") -or ($VMNetwork -eq $NULL))
{
Write-Host -Foreground Red "Invalid selection made, please enter a valid selection:"
}
}
until ($VMSwitch -le $VMSwitches.GetUpperBound(0)+1)# Set ISO File to boot from
$ISOFILE =
$ISOFILE="D:\Shared\ISO\PXE Booters\LiteTouchPE_x64.iso"
$TestISO = Test-Path $ISOFILE
If ($TestISO -eq $False)
{
cls
Write-Host ""
Write-Host -Foreground Red "Warning: ISO File missing"
Write-Host ""
Write-Host "No ISO file will be mounted"
Write-Host ""
Write-Host "Path tested = $ISOFILE"
Write-Host ""
Pause
}$VMPath = $Storage + ":\Hyper-V"
#$VMSwitch = "VMSwitch"# Check to make sure there are no file conflicts
$TestPath = Test-Path $VMPath\$VMName
If ($TestPath -eq $True)
{
cls
Write-Host ""
Write-Host -Foreground Red "Error: VM Folder already exists!!!"
Write-Host ""
Write-Host "Choose a new VM name and start again."
Write-Host ""
Write-Host "Path tested = $VMPath\$VMName"
Write-Host ""
Pause
}
Else
{
# Create Virtual Machine
MD $VMPath -ErrorAction SilentlyContinue
New-VM $VMName -path $VMPath -SwitchName $VMNetwork -Generation 1
New-VHD -Path $VMPath\$VMName\$VMName.C.vhdx -size $VDisk1
New-VHD -Path $VMPath\$VMName\$VMName.D.vhdx -size $VDisk2
Add-VMHardDiskDrive -VMName $VMName -Path $VMPath\$VMName\$VMName.C.vhdx
Add-VMHardDiskDrive -VMName $VMName -Path $VMPath\$VMName\$VMName.D.vhdx
If ($ISOFILE -ne $NULL)
{
Set-VMDvdDrive -VMName $VMName -ControllerLocation 0 -ControllerNumber 1 -Path $ISOFILE
}
Get-VM $VMName | Set-VMMemory -DynamicMemoryEnabled $True -MaximumBytes $MaximumMem -MinimumBytes $MinimumMem -StartupBytes $StartupMem
Get-VM $VMName | Set-VM -ProcessorCount 2 -AutomaticStartAction Start -AutomaticStartDelay 60 -AutomaticStopAction ShutDown
Get-VM $VMName | Start-VM
echo off
$VDisk1 = [int64]$VDisk1 / 1073741824
$VDisk2 = [int64]$VDisk2 / 1073741824
$StartupMem = [int64]$StartupMem / 1048576
$MinimumMem = [int64]$MinimumMem / 1048576
$MaximumMem = [int64]$MaximumMem / 1048576
#cls
$NewVM = Get-VM -Name $VMName
If ($NewVM -eq $NULL)
{
Write-Host -Foreground Red "*** Oh no, something went wrong. ***"
Write-Host -Foreground Red "*** VM Not found. Check script.. ***"
Pause
}
Else
{
Write-Host -foreground Green "Created a new virtual machine called ‘$VMName’ "
Write-Host ""
Write-Host -foreground Yellow "$VMName has the following properties:"
Write-Host "VM Location = $VMPath\$VMName"
Write-Host "Virtual CPU’s = 2"
Write-Host "Dymanic Memory = ‘Enabled’"
Write-Host "Startup Memory = $StartupMem MB"
Write-Host "Minimum Memory = $MinimumMem MB"
Write-Host "Maximum Memory = $MaximumMem MB"
Write-Host "Virtual Disk 1 = $VMName.C.vhdx | $VDisk1 GB"
Write-Host "Virtual Disk 2 = $VMName.D.vhdx | $VDisk2 GB"
Write-Host "Virtual Network = $VMNetwork"
Write-Host "Mounted ISO = $ISOFILE"
Write-Host ""
Write-Host "The VM will now start a new MDT Build"
Write-Host "using the Server 2012 R2 Task Sequence"
Write-Host ""
Pause
}
}
Cheers’ Dan