MENU
カテゴリー
アーカイブ

仮想マシンのエクスポートを自動化する。

Windowsのタスクスケジューラーで定期的にエクスポートする。

こちらのサイトに素晴らしいスクリプトを公開していただいてたから利用させてもらった。

Hyper-V 仮想マシン エクスポートの自動化 ←ページが消えてた あった!

<###
    このスクリプトについて:
 
    仮想マシンをエクスポートする処理を行います。
    (併せて、古いエクスポートを削除します)
 
    このシェルはタスクスケジューラーによって毎日 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
}

仮想マシンはこのサイトを運用している1台きりだから、フォルダー構成など異なる部分を書き換えてDaily_VM_Export.ps1として保存。

もうひとつ、中身が次のようなDaily_VM_Export.batファイルを作って、タスクスケジューラーで「最上位の特権で実行する」とした。ファイルの保存先はCドライブの直下。

powershell -ExecutionPolicy RemoteSigned -File C:\Daily_VM_Export.ps1

コメント

コメントする

目次