Hyper-Vのvhdxを圧縮するのはPowerShellでやるんだけど、その自動化手法がおもしろいじゃんの続き。以下2点の改修をしたスクリプトを作ってみた。
・vhdファイルが存在しなければ、エラーを出して終了
・圧縮前と後で、vhdのファイルサイズがどれだけ減ったかを比率で出す
手順と経過は以下の通り。
1.compvhdに必要なファイルをダウンロードして解凍
2.解凍結果のcompvhd.ps1を編集
2行目の「vhd(x)ファイル名フルパス」を実際のvhdファイルのフルパスに書き換えて保存
3.解凍結果のcompvhd.batを管理者として実行 ※ダブルクリックして実行すると権限エラーになる
4.2で指定したファイルが存在しなければ圧縮失敗で終了
5.圧縮に成功すれば、圧縮前後のファイルサイズと比率を表示して終了
ps1の中身を以下に転記しておく。
#vhd(x)ファイル名フルパス 例)C:\work\test.vhdx $targetvhd = "vhd(x)ファイル名フルパス" #必要な定義 Add-Type -Assembly System.Windows.Forms #メッセージ表示に必要な宣言 $k = "<code>r</code>n" #改行コード #ファイル存在チェック If((Test-Path $targetvhd) -ne $TRUE) { [System.Windows.Forms.MessageBox]::Show("ファイルが見つかりません。" + $k + $targetvhd, "圧縮失敗") exit } #圧縮実行 $size1 = (Get-ChildItem $targetvhd).Length #圧縮前のファイルサイズ Mount-VHD $targetvhd -Readonly Optimize-VHD $targetvhd -Mode Quick Optimize-VHD $targetvhd -Mode Quick Dismount-VHD $targetvhd $size2 = (Get-ChildItem $targetvhd).Length #圧縮後のファイルサイズ #メッセージ表示 $msg1 = "圧縮前:{0} byte" -f $size1 $msg2 = "圧縮後:{0} byte" -f $size2 $h = $size1 / $size2 * 100 $msg3 = "比率:{0} %" -f $h.ToString("0.00") [System.Windows.Forms.MessageBox]::Show($msg1 + $k + $msg2 + $k + $msg3, "圧縮成功")
PowerShellっておもしろい。DOSコマンドラインの流れを汲んでいるかと思いきや、立派なプログラム言語だった。イコール演算子が=や==ではなくて-eqというのがおもしろい。TrueとFalseは、$TRUEおよび$FALSEと書かなければならない。
本当はもう一つやりたかったんだけど、やり方がわからず断念。上記手順の2でvhdのファイルパスを自分で書き変えなきゃいけないのが難点だから、ps1と同じ場所にあるvhdまたはvhdxを探して、1つだけだったら無条件に圧縮実行。2つ以上あったら、そのリストを出してどれを圧縮するか指定させる。。なんて感じ。第3弾でやってみましょ。
関係記事はこちら。
Hyper-Vのvhdxを圧縮するのはPowerShellでやるんだけど、その自動化手法がおもしろいじゃん(1)
Hyper-Vのvhdxを圧縮するのはPowerShellでやるんだけど、その自動化手法がおもしろいじゃん(3)