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)