Hyper-V 仮想マシン エクスポートの自動化


Hyer-V @ Windows Server 2012R2 で仮想マシンのエクスポートを自動化した際の作業記録です。

PowerShell の Export-VM コマンドレット で仮想マシンをエクスポート、併せて古いエクスポートは削除する、の動作をするPowerShell スクリプトを作成して、このスクリプトを Windows のタスクスケジュラーから毎日起動して実行する、といった運用です。

 

PowerShell スクリプトは ↓ こんなものを作ってみました。

<###
    このスクリプトについて:

    仮想マシンをエクスポートする処理を行います。
    (併せて、古いエクスポートを削除します)

    このシェルはタスクスケジューラーによって毎日 AM 2:00 に起動されます。


    STEP1: 仮想マシンをエクスポート
    STEP2: 古いエクスポートを削除
###>



<### 
    【STEP 1】
    仮想マシンを下記パスにエクスポートする
        E:\Daily_ExportedVM\<日付>\
###>

### 日付の取得
$NowDate = Get-Date -Format "yyyyMMdd_HHmmss"

### エクスポート対象の仮想マシンの指定
$TragetVM01 = "devmiz01"
$TragetVM02 = "hogehoge"

### エクスポート先のパスを指定
$ExportPath = "E:\Daily_ExportedVM\$NowDate\"

### Exportの成功 or 失敗の判断を STEP2(古いフォルダの削除)でするための変数($CheckCode)を定義
### 最初に0(=成功)を代入しておく。(失敗を検知したら 1 が代入される)
$CheckCode = 0


### コマンドエラー時に Try-Catch の Catch 部分が実行されるように、デフォルトパラメータを Stopに変更
$ErrorActionPreference = "stop"


### TargetVM01のエクスポート
### try-catch を使って、エラー発生時の処理を実装(catch内がエラー時のアクション)
Try {
    ### 仮想マシンのエクスポートを実行
    Export-VM -Name $TragetVM01 -Path $ExportPath -ErrorVariable ExportError01 |
    Out-Null   ### Out-Null することで Export-VM が終了するのを待つ。

### Export-VM がエラーになったら、エラー内容をファイルに出力して、$CheckCode に 1を代入
}Catch{

    ### エラーを このファイルに出力→ E:\Daily_ExportedVM\ExportErrorCode-$TragetVM01-$NowDate.txt 
    echo $ExportError01 | 
    Out-File E:\Daily_ExportedVM\ExportErrorCode-$TragetVM01-$NowDate.txt

    ### エラーの場合は変数 'CheckCode'に 1 を代入(0以外の代入でSTEP2の際に中止ルーチンに移行)
    $CheckCode = 1

}
Out-Null


### TargetVM02のエクスポート
### try-catch を使って、エラー発生時の処理を実装(catch内がエラー時のアクション)

Try {
    ### 仮想マシンのエクスポートを実行
    Export-VM -Name $TragetVM02 -Path $ExportPath -ErrorVariable ExportError02 |
    Out-Null   ### Out-Null することで Export-VM が終了するのを待つ。

### Export-VM がエラーになったら、エラー内容をファイルに出力して、$CheckCode に 1を代入
}Catch{

    ### エラーを このファイルに出力→ E:\Daily_ExportedVM\ExportErrorCode-$TragetVM01-$NowDate.txt 
    echo $ExportError02 | 
    Out-File E:\Daily_ExportedVM\ExportErrorCode-$TragetVM02-$NowDate.txt

    ### エラーの場合は変数 'CheckCode'に 1 を代入(0以外の代入でSTEP2の際に中止ルーチンに移行)
    $CheckCode = 1

}
Out-Null



<### 
    【STEP 2】
    古いエクスポートの削除
    2世代(過去2日分)のこす ← HDDの使用状況を見ながら調整

    $DeleteTime で経過時間を指定。
    $DeleteTime = "-n"  n(分/min)。 n分前を指定するので、マイナスをつける
    2日 = 2880min (60min * 24hour * 2day)
    3日 = 4320min (60min * 24hour * 3day)
    10日 = 14400min (60min * 24hour * 10day)
###>
#$DeleteTime = "-5"       ### 5分経過(テスト用)
$DeleteTime = "-4320"   ### 3日 ← 4320だと3日前のが残っちゃうので、4300 とかちょっと減らしておくのがいいかも。


### Export-VM が例外処理で停止していなければ($CheckCode = 0)、古いフォルダの削除実施
if ( $CheckCode -eq 0 ) {
    ### 対象フォルダ配下のリストを取得
    Get-ChildItem E:\Daily_ExportedVM |
    ### 作成されてから $DeleteTime の値を超過したフォルダ・ファイルを選択/抽出
    Where-Object {
    $_.CreationTime -lt (Get-Date).AddMinutes($DeleteTime)
    } |
    ### 対象を絶対パスに変換し、削除
    foreach {
        Remove-Item -Recurse -Force $_.FullName
    }
### $Code != 0 であれば(1が代入されていれば)処理を中止。
} else {
    exit
}

 

↑ このスクリプトを 「 C:\02.Daily_VM_Export_Shell\Daily_VM_Export.ps1 」 という名前で保存。

 

このスクリプトが毎日 AM 2:00 に実行されるように、タスクスケジューラーに登録。
↓ 登録はこんなんにしました。

 

 

操作の中身は、

 

「プログラム/スクリプト」

 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

「引数の追加」

 -Command "C:\02.Daily_VM_Export_Shell\Daily_VM_Export.ps1"

「開始」

 C:\02.Daily_VM_Export_Shell

 

 

今回の備忘録は以上です。