Windows/Powershell/Hyper V
From r00tedvw.com wiki
Install
To Install the Hyper-V Powershell Module (Done on Windows 10 client)
PS> Get-WindowsOptionalFeature -Online -FeatureName *hyper-v* | select DisplayName, FeatureName DisplayName FeatureName ----------- ----------- Hyper-V Microsoft-Hyper-V-All Hyper-V Platform Microsoft-Hyper-V Hyper-V Management Tools Microsoft-Hyper-V-Tools-All Hyper-V Module for Windows PowerShell Microsoft-Hyper-V-Management-PowerShell Hyper-V Hypervisor Microsoft-Hyper-V-Hypervisor Hyper-V Services Microsoft-Hyper-V-Services Hyper-V GUI Management Tools Microsoft-Hyper-V-Management-Clients PS> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Management-PowerShell Path : Online : True RestartNeeded : False
Scripts
Clone VM
Quick script to clone a VM based on an existing "master".
param( [parameter(ParameterSetName="createvm")][int64]$Epoch = [long](Get-Date -Date ((Get-Date).ToUniversalTime()) -UFormat %s), [parameter(ParameterSetName="createvm")][ValidateSet('Win2k16-Master','Win2k12r2-Master','Win2k16GVEUpgrade-Master','Win2k12r2GVEUpgrade-Master','Linux-Master')][string]$BaseImage = "Linux-Master", [parameter(ParameterSetName="createvm")][string]$ComputerName = "win-45mo0eqvg4g", [parameter(ParameterSetName="createvm")][string]$Name = -join($BaseImage, "-", $Epoch), [parameter(ParameterSetName="createvm")][string]$Path = "C:\ProgramData\Microsoft\Windows\Hyper-V\", [parameter(ParameterSetName="createvm")][string]$NewVHDPath = "C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\$Name.vhdx", [parameter(ParameterSetName="createvm")][string]$NewVHDSizeBytes = 20GB, [parameter(ParameterSetName="createvm")][int]$Generation = 1, [parameter(ParameterSetName="createvm")][string]$MemoryStartupBytes = 1GB, [parameter(ParameterSetName="createvm")][string]$SwitchName = "External_Virtual_Switch_01", [parameter(ParameterSetName="createvm")][int]$ProcessorCount = 1, [parameter(ParameterSetName="createvm")][int64]$MemoryMinimumBytes = 1073741824, [parameter(ParameterSetName="createvm")][int64]$MemoryMaximumBytes = 2147483648, [parameter(ParameterSetName="createvm")][string]$AutomaticStartAction = "Nothing", [parameter(ParameterSetName="createvm")][int]$AutomaticStartDelay = 1, [parameter(ParameterSetName="createvm")][string]$AutomaticStopAction = "Shutdown", [parameter(ParameterSetName="createvm")][string]$Date = (Get-Date), [parameter(ParameterSetName="createvm")][string]$Notes = "Created $Date" ) function CreateVM { New-VM -ComputerName $ComputerName ` -Name $Name ` -Path $Path ` -VHDPath $newVHDPath ` -Generation $Generation ` -MemoryStartupBytes $MemoryStartupBytes ` -SwitchName $SwitchName } function ConfigureVM { Set-VM -ComputerName $ComputerName ` -Name $Name ` -ProcessorCount $ProcessorCount ` -DynamicMemory ` -MemoryMinimumBytes $MemoryMinimumBytes ` -MemoryMaximumBytes $MemoryMaximumBytes ` -AutomaticStartAction $AutomaticStartAction ` -AutomaticStartDelay $AutomaticStartDelay ` -AutomaticStopAction $AutomaticStopAction ` -Notes $Notes } function DeleteVM { $disk = Get-VMHardDiskDrive -ComputerName $ComputerName -VMName $Name | Select-Object -ExpandProperty Path Remove-Item $disk Remove-VM -ComputerName $ComputerName -Name $Name -Force } function ValidateName { Get-VM -ComputerName $ComputerName | ForEach-Object { if ($_.VMName -eq $Name) { $script:LogOut = "$Date - Failed to create the VM with the name: $Name. A VM already exists with that name." exit } else { return } } } function CloneVHD { #$srcVHD = -join((Split-Path -Path $NewVHDPath), "\", $BaseImage, ".vhdx") $srcVHD = Get-VMHardDiskDrive -ComputerName $ComputerName -VMName $BaseImage | Select-Object -ExpandProperty Path $newVHD = -join((Split-Path -Path $NewVHDPath), "\", $BaseImage, "-", $Epoch, ".vhdx") New-VHD -Differencing -Path $newVHD -ParentPath $srcVHD } function ClearVariables { #$Variables = Get-Variable | Where-Object {($_.Attributes -like "System.Management.Automation.ArgumentTypeConverterAttribute") -and ($_.Name -notin "ConfirmPreference","DebugPreference","ErrorActionPreference","InformationPreference","OutputEncoding","ProgressPreference","PSDefaultParameterValues","VerbosePreference","WarningPreference")} | Select-Object -ExpandProperty Name $Variables = ("Epoch", "BaseImage", "ComputerName", "Name", "Path", "NewVHDPath", "NewVHDSizeBytes" , "Generation", "MemoryStartupBytes", "SwitchName", "ProcessorCount", "MemoryMinimumBytes", "MemoryMaximumBytes", "AutomaticStartAction", "AutomaticStartDelay", "AutomaticStopAction", "Date", "Notes") foreach ($Variable in $Variables) { Get-Variable $Variable | Clear-Variable -Force -ErrorAction SilentlyContinue } } #Set-PSDebug -Off #Set-PSDebug -Trace 2 try { ValidateName -ErrorAction Stop CloneVHD -ErrorAction stop CreateVM -ErrorAction Stop $script:LogOut = "$Date - Created VM $Name" } catch { $ErrorMessage = $_.Exception.Message $script:LogOut = "$Date - Failed to create the VM $Name. The error message was $ErrorMessage" Break } finally { echo $script:LogOut | Out-File C:\logs\vm-script.log -Append } try { ConfigureVM -ErrorAction Stop $script:LogOut = "$Date - Configured VM $Name" } catch { $ErrorMessage = $_.Exception.Message $script:LogOut = "$Date - Failed to configure the VM $Name. The error message was $ErrorMessage ---- Deleting VM $Name due to configuration failure." DeleteVM Break } finally { echo $script:LogOut | Out-File C:\logs\vm-script.log -Append } #Get-Variable | ForEach-Object { $_.Name } ClearVariables