vhdを手軽に圧縮できるPowerShellプログラムの決定版。
まずは、前回考えたことを振り返る。。
ps1内のvhdのファイルパスを自分で書き変えなきゃいけないのが難点だから、ps1と同じ場所にあるvhdまたはvhdxを探して、1つだけだったら無条件に圧縮実行。2つ以上あったら、そのリストを出してどれを圧縮するか指定させる。。なんて考えたことの決定的な解決策が出てきたので、第3弾として記事を書く。おそらくこれがこのシリーズの最終回になるだろう。
手順と経過は以下の通り。
1.compvhdに必要なファイルをダウンロードして解凍
2.解凍結果のcompvhd.batを管理者として実行 ※ダブルクリックして実行すると権限エラーになる
3.ファイル選択が出るので、ターゲットのvhdファイルを選択する
指定したファイルが存在しなければ圧縮失敗で終了。自分で選択しているファイルなんだから、存在しないわけないけど。。
4.圧縮に成功すれば、圧縮前後のファイルサイズと比率を表示して終了
PowerShellはCUIだと思い込んでいたから、上で書いたようにメンドウな手順を考えた。しかし、前回ダイアログボックスを出せることがわかっていたので、ファイル選択出せばいいじゃんと思い至った。PowerShellはGUIを使えるってことが発見だ。
ググればこんな記事がすぐに見つかる。便利な世の中ですなぁ。
PowerShell でファイル選択ダイアログを利用する
ps1の中身を以下に転記しておく。
[void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")
#ファイル選択でvhdまたはvhdxファイルを選ばせる
$dialog = New-Object System.Windows.Forms.OpenFileDialog
$dialog.Filter = "仮想ディスクファイル(*.vhd;*.vhdx)|*.vhd;*.vhdx"
$dialog.InitialDirectory = "C:\"
$dialog.Title = "仮想ディスクファイルを選択してください"
if($dialog.ShowDialog() -ne [System.Windows.Forms.DialogResult]::OK){
exit
}
$targetvhd = $dialog.FileName
#必要な定義
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 = $size2 / $size1 * 100
$msg3 = "比率:{0} %" -f $h.ToString("0.00")
[System.Windows.Forms.MessageBox]::Show($msg1 + $k + $msg2 + $k + $msg3, "圧縮成功")
関係記事はこちら。
Hyper-Vのvhdxを圧縮するのはPowerShellでやるんだけど、その自動化手法がおもしろいじゃん(1)
Hyper-Vのvhdxを圧縮するのはPowerShellでやるんだけど、その自動化手法がおもしろいじゃん(2)