手軽にテストが出来る便利な反面、複数台を一度に新規登録し、作業完了後に削除する作業が面倒になってきたので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"
}
