かつて山市良と呼ばれたおじさんのブログ

セイテクエンジニアのブログ  かつて山市良と呼ばれたおじさんのブログ  vol.239 自動化スクリプト ─ テストの自動化|Hyper-V 小技・裏技集

 

 

vol.239 自動化スクリプト ─ テストの自動化|Hyper-V 小技・裏技集

2026年10月05日配信
執筆者:山内 和朗

 「Hyper-V小技・裏技集」シリーズでは、Hyper-Vの仮想環境を利用していて、知っていると便利な小技や裏技を紹介します。前々回は、PowerShell DirectとCopy-VMFileの使いこなしについて説明しました。これらを活用した、VMのゲスト側タスクの自動化例を紹介しています。

 

※ここで紹介するサンプルコードは、PowerShellスクリプト(.ps1)内に記述することを想定しています。-ErrorAction Stopパラメーターは、エラー時にスクリプト全体を停止します。PowerShellウィンドウに入力して実行した場合は、エラーが発生しても以後のスクリプトは停止しないため、別のエラーが発生する可能性があることに注意してください。

 

チェックポイント作成、VMの起動、テスト実施、ロールバック

 

 VM環境は、チェックポイントを利用して状態をロールバックしたり、特定時点の状態を保存したりすることができるため、テスト環境として非常に有用です。設定変更や更新プログラムの適用、スクリプトの実行などを行う前にチェックポイントを作成しておけば、問題が発生した場合でも短時間で元の状態に戻すことができます。そのため、実環境に影響を与えることなく、さまざまな操作や障害発生時の動作を繰り返し検証できます。

 

 次のPowerShellスクリプトは、次の一連の作業を自動実行します(画面1)。ホスト側に用意するテスト用スクリプトの内容を書き換えることで、同じPowerShellコードでさまざまなテストシナリオに対応できます。

 

  • ロールバックできるようにVMのチェックポイントを作成する。

  • VMで統合サービスの「ゲスト サービス インターフェイス」が有効になっていなければ有効化する。

  • VMを起動して、ゲストOSが起動するまで待機する。

  • Hyper-Vホスト側に用意しておいたテスト用のPowerShellスクリプトファイル($testScriptPath)を、Hyper-VのCopy-VMFileを使用してVMのゲストOSのC:¥にコピーする。

  • Invoke-Commandを使用して、テスト用スクリプトをVMのゲストOSで実行し、実行結果を$resultで受け取る。

  • 最新のチェックポイントをVMに適用してロールバックする。

  • 最新のチェックポイントを削除する。

  • テスト結果($result)を表示する。

 

#$cred = Get-Credential
# または
#(事前に Get-Credential | Export-Clixml $HOME\vm01-cred.xml でXMLを作成)
#$cred = Import-Clixml $HOME\vm01-cred.xml
# または
$username = ".\Administrator"
$password = "P@ssw0rd!"
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force
$cred = [PSCredential]::new($username, $securePassword)

$vmName = "vm01"
$testScriptPath = "E:\Tools\TestScript.ps1"
$guestTargetPath = "C:\"

$vm = Get-VM -Name $vmName -ErrorAction Stop

# Create Checkpoint
$vm | Checkpoint-VM -SnapshotName "PreTest"
$lastcheckpoint = $vm | Get-VMSnapshot | Sort CreationTime | Select -Last 1

# Enable VMGuestSvc
$guestSvcDefault = (Get-VMIntegrationService -VMName $vm.Name "ゲスト サービス インターフェイス").Enabled
if (!$guestSvcDefault) {
  Enable-VMIntegrationService -VMName $vm.Name "ゲスト サービス インターフェイス"
}

# Start VM
$vm | start-VM -ErrorAction Stop
while ($vm.Heartbeat -notlike "Ok*") {
    Start-Sleep -Seconds 1
}
Write-Host "$($vm.Name) is Up."

# Copy Test Script
Copy-VMFile -Name $vm.Name -SourcePath $testScriptPath -DestinationPath $guestTargetPath -FileSource Host -Force

# Run Test
$testScript = Join-Path "C:\" (Split-Path $testScriptPath -Leaf)

$result = Invoke-Command -VMName $vm.Name -Credential $cred -ScriptBlock { & $using:TestScript } 

# Restore and Remove Checkpoint
$lastcheckpoint | Restore-VMSnapshot -Confirm:$false
$lastcheckpoint | Remove-VMSnapshot

# Test result
$result

(プレーンテキストでダウンロード/表示)

※ この例のようにスクリプト内に平文パスワードを記述することは推奨されません。平文パスワードを排除する方法については、vol.238の「スクリプトから平文パスワードを排除する簡単な方法」を参照してください。

 

画面1 チェックポイントを作成し、テスト実施後、ロールバックするPowerShellスクリプトの実行例。この例では、テストスクリプトで円周率を計算(ライプニッツ級数)されている(画面のクリックで拡大)
画面1 チェックポイントを作成し、テスト実施後、ロールバックするPowerShellスクリプトの実行例。この例では、VMのコンピューティング能力を使用して、テストスクリプトで円周率を計算(ライプニッツ級数)させている(画面のクリックで拡大)

 

 なお、上記スクリプトのゲストサービスインターフェイスの有効化部分は、統合サービスを名前(Name)で指定しているため、日本語環境のHyper-Vホストでないと正しく機能しません。次のように、統合サービスのIdプロパティを使用することで、日本語環境への依存を排除できます。

$vmGuestSvc = $vm | Get-VMIntegrationService | Where{ $_.id -eq "Microsoft:$($vm.id)\6C09BB55-D683-4DA0-8931-C9BF705F6480"}
$vmGuestSvcDefault = $vmGuestSvc.Enabled
if (!$vmGuestSvcDefault) {
  Enable-VMIntegrationService -VMName $vm.Name $vmGuestSvc.Name
}

 

 特定のVM(またはチェックポイント)の統合サービスのIdは以下のとおりです。

統合サービス Id
ハートビート

Microsoft:VMId(VMSnapshotId)\84EAAE65-2F2E-45F5-9BB5-0E857DC8EB47

キー値ペア交換

Microsoft:VMId(VMSnapshotId)\2A34B1C2-FD73-4043-8A5B-DD2159BC743F

シャットダウン

Microsoft:VMId(VMSnapshotId)\9F8233AC-BE49-4C79-8EE3-E7E1985B2077

時刻の同期

Microsoft:VMId(VMSnapshotId)\2497F4DE-E9FA-4204-80E4-4B75C46419C0

VSS

Microsoft:VMId(VMSnapshotId)\5CED1297-4598-4915-A5FC-AD21BB4D02A4

ゲスト サービス インターフェイス

Microsoft:VMId(VMSnapshotId)\6C09BB55-D683-4DA0-8931-C9BF705F6480

 

リファレンス(Microsoft Learn):
Get-VM(Hyper-V)| Start-VM(Hyper-V)| Checkpoint-VM(Hyper-V)| Restore-VMSnapshot(Hyper-V)| Remove-VMSnapshot(Hyper-V)| Invoke-Command(PowerShell)| Copy-VMFile(Hyper-V)| Export-Clixml(PowerShell)| Import-Clixml(PowerShell)


Hyper-V 小技・裏技集 (1)|(2)|(3)|(4)|(5)|(6)|(7)|(8)

blog_yamanxworld_subscribe

blog_yamanxworld_comment

blog_yamanxworld_WP_ws2025

最新記事