手軽にテストが出来る便利な反面、複数台を一度に新規登録し、作業完了後に削除する作業が面倒になってきたのでPowerShellの勉強を兼ねて[Create-VM]関数と[Delete-VM]関数を書いてみました。
GUIで設定するよりもCUIで設定した方が非常に簡単・迅速に仮想マシンが作成できます。
2014.06.05 [Create-VM]関数に仮想DVDドライブのブート順を変更するスクリプトを追記しました。
Hyper-V 仮想DVD ドライブをブート順の最優先に設定する~Set-VMFirmware
Create-VM~仮想マシンを作成、起動する
使い方は、幾つかのパラメータを指定し、下記手順のとおり動作します。- VHDXファイルの作成
- VMの新規登録
- VMの起動(ISOファイルを指定された場合のみ)
サンプル
#テストデータ [string]$VMName = "WS2012R2" [string]$VMPath = "C:\ProgramData\Microsoft\Windows\Hyper-V\$VMName\Virtual Hard Disks" [string]$VMNetwork = "lan" [double]$VMMemory = 2024MB [double]$VMDiskSize = 160GB [int]$VMGeneration = 1 [string]$ISOImage = "C:\temp\WS2012R2.iso" #Sample Create-VM -VMName $VMName -VMNetwork $VMNetwork -VMPath $VMPath ` -VMMemory $VMMemory -VMDiskSize $VMDiskSize -VMGeneration $VMGeneration -ISOImage $ISOImage
スクリプト
$Global:TARGET = "Target : Windows 8/8.1, Windows Server 2012/2012 R2" $Global:VERSION = "Version : 1.0.0" #仮想マシン作成 function Create-VM{ [Cmdletbinding()] param( [string]$VMName, [string]$VMPath, [string]$VMNetwork, [double]$VMMemory = 1024MB, [double]$VMDiskSize = 64GB, [int]$VMGeneration = 1, [string]$ISOImage = "" ) Clear-Host #開始メッセージ Write-Host "************************************************" -ForegroundColor Cyan Write-Host "* Hyper-V 2012 仮想マシン作成 スクリプト" -ForegroundColor Cyan Write-Host "* $Global:TARGET" -ForegroundColor Cyan Write-Host "* $Global:VERSION" -ForegroundColor Cyan Write-Host "************************************************" -ForegroundColor Cyan Write-Host "" Write-Host "実行OS : " -NoNewline; Write-Host (Get-WMIObject Win32_OperatingSystem).Caption -ForegroundColor Green Write-Host "" Write-Host "★作成する仮想マシン情報" -ForegroundColor Yellow Write-Host "-- 仮想マシン名 - [$VMName]" -ForegroundColor Yellow Write-Host "-- フォルダ パス - [$VMPath]" -ForegroundColor Yellow Write-Host "-- VHDXファイル名 - [$VMName.vhdx]" -ForegroundColor Yellow Write-Host "-- ネットワーク名 - [$VMNetwork]" -ForegroundColor Yellow Write-Host "-- メモリサイズ - [$VMMemory]" -ForegroundColor Yellow Write-Host "-- ディスクサイズ - [$VMDiskSize]" -ForegroundColor Yellow Write-Host "-- VM世代 - [$VMGeneration]" -ForegroundColor Yellow Write-Host "-- ISOファイル - [$ISOImage]" -ForegroundColor Yellow Write-Host "" Write-Host "開始しますか?" -ForegroundColor Cyan Write-Host "[Y]はい, [N]いいえ, 既定[N]:" -NoNewline -ForegroundColor Cyan $answer = Read-Host if($answer -ne "Y") { Write-Host "処理を中止します。" return } #VMフォルダチェック if(Test-Path $VMPath){ Write-Host "仮想マシン[$VMName]は既に作成されているため、処理を停止します。" return } #VMフォルダ作成 New-Item "$VMPath" -ItemType directory | Out-Null Write-Verbose "フォルダを作成しました: [$VMPath]" #VHDXファイル作成 $VMDisk = New-VHD -Path "$VMPath\$VMName.vhdx" -SizeBytes $VMDiskSize -Dynamic ` -ErrorAction Stop Write-Verbose "VHDXファイルを作成しました: [$VMPath\$VMName.vhdx]" #VM作成 $VM = New-VM -Name $VMName ` -VHDPath $VMDisk.path ` -MemoryStartupBytes $VMMemory ` -SwitchName $VMNetwork ` -Generation $VMGeneration ` -ErrorAction Stop Write-verbose "仮想マシンを新規作成しました" #ダイナミックメモリ有効 Set-VMMemory -VMName $VMName -DynamicMemoryEnabled $true Write-verbose "ダイナミックメモリを有効にしました" #DVDドライブ if($ISOImage -ne "") { Set-VMDvdDrive -VMName $VMName -Path $ISOImage -ControllerNumber 1 Set-VMFirmware -VMName $VMName -FirstBootDevice (Get-VMDvdDrive -VMName $VMName) Write-verbose "仮想DVDドライブにISOをセットしました: [$ISOImage]" } #チェック Write-verbose "仮想マシン一覧..." | get-vm | ft #VM開始 if($ISOImage -eq "") { Write-Host "" Write-Host "ISOファイルが指定されていません。" -ForegroundColor Yellow Write-Host "手動で設定し、VMを起動してください。" -ForegroundColor Yellow return } else { Write-Host "" Write-Host "★仮想マシン [$VMName] を起動しますか?" -ForegroundColor Yellow Write-Host "起動DVD:$ISOImage" -ForegroundColor Yellow Write-Host "[Y]はい, [N]いいえ, 既定[N]:" -NoNewline -ForegroundColor Yellow $answer = Read-Host if($answer -eq "Y") { Start-VM -Name $VMName Write-Host "仮想マシン [$VMName] を起動しました" } else { Write-Host "中止しました" } } }
Delete-VM~仮想マシンを削除する
使い方は、パラメータに仮想マシン名を指定するだけです。サンプル
#テストデータ [string]$VMName = "WS2012R2" #Sample Delete-VM -VMName $VMName
スクリプト
#VM+ファイル削除 function Delete-VM { [Cmdletbinding()] param( [parameter(Mandatory=$true)] [string]$VMName ) #削除フォルダ [string]$VMPath = (Get-vm -name $VMName).ConfigurationLocation #画面クリア Clear-Host Write-Host "注意:定された仮想マシンに対し下記処理を実行します。" -ForegroundColor Yellow Write-Host "-- [停止] 仮想マシン : [$VMName]" Write-Host "-- [削除] 仮想マシン : [$VMName]" Write-Host "-- [削除] 仮想マシン フォルダ : [$VMPath] 配下全て" Write-Host "" Write-Host "★仮想マシン [$VMName] を本当に削除しますか?" -ForegroundColor Yellow Write-Host "[Y]はい, [N]いいえ, 既定[N]:" -NoNewline -ForegroundColor Yellow $answer = Read-Host if($answer -eq "Y") { #VM停止 Stop-VM -VMName $VMName -Force Write-Verbose "VMを停止しました" #VM削除 Remove-VM -Name $VMName -Force Write-Verbose "VMを停止しました" #ファイル削除 Remove-Item -Path "$VMPath\$VMName" -Recurse -Force Write-Verbose "VMを停止しました" Write-Host "仮想マシン [$VMName] を削除しました" } else { Write-Host "中止しました" } }
余談:スクリプト ファイルのインポートと再インポート
- スクリプト ファイル(.ps1)のインポート
Import-Module xxx.ps1 - スクリプト ファイルを修正した場合
Remove-Module コマンドレット→Import-Module コマンドレット - プロファイル($PROFILE)を利用
notepad.exe $PROFILEを実行し[Import-Module~]を記述し保存
PowerShellで$PROFILEに追記する場合は下記スクリプトのようになります。
if((Test-Path $profile) -eq $false) { New-Item -Path $profile -type file -Force Add-Content -Path $profile -Value "Import-Module C:\temp\xxx-VM.ps1" }