2014/06/04

PowerShell Hyper-Vの仮想マシンを新規作成・削除する 自作 関数~Create-VM 関数,Delete-VM関数

テスト環境のWindows Server 2012 R2 StandardにHyper-V サービスを稼働させています。
手軽にテストが出来る便利な反面、複数台を一度に新規登録し、作業完了後に削除する作業が面倒になってきたので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"
}
スポンサーリンク

スポンサーリンク