CAD日記

主にAutoCADのことについて書いているけど、近頃は投資系ネタに注力している。自動売買、仮想通貨、PC関係、プログラミングなど。@caddiary

ソフト開発

Hyper-Vのvhdxを圧縮するのはPowerShellでやるんだけど、その自動化手法がおもしろいじゃん(3)

投稿日:2020年3月8日 更新日:

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 = &quot;<code>r</code>n&quot;  #改行コード

#ファイル存在チェック
If((Test-Path $targetvhd) -ne $TRUE)
{
    [System.Windows.Forms.MessageBox]::Show(&quot;ファイルが見つかりません。&quot; + $k + $targetvhd, &quot;圧縮失敗&quot;)
    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 = &quot;圧縮前:{0} byte&quot; -f $size1
$msg2 = &quot;圧縮後:{0} byte&quot; -f $size2
$h = $size2 / $size1 * 100
$msg3 = &quot;比率:{0} %&quot; -f $h.ToString(&quot;0.00&quot;)
[System.Windows.Forms.MessageBox]::Show($msg1 + $k + $msg2 + $k + $msg3, &quot;圧縮成功&quot;)

関係記事はこちら。
Hyper-Vのvhdxを圧縮するのはPowerShellでやるんだけど、その自動化手法がおもしろいじゃん(1)
Hyper-Vのvhdxを圧縮するのはPowerShellでやるんだけど、その自動化手法がおもしろいじゃん(2)

-ソフト開発

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

no image

イテレータ(Iterator)

あるコンポーネントで初めて出会いました。コンポーネントがバージョンアップされたときに、オブジェクト指向的な作りに一新されて、いろいろ変わったのですが中でもイテレータという訳の分からないものに遭遇して、 …

Pythonでプロポーショナルフォントかどうかをチェックする

PythonからWin32APIを呼び出すには、ライブラリpywin32を使う必要がある。 けっこうな数のWin32APIを使えるのはいいんだけど、使い方にくせがあってしかもネットに情報がないので、以 …

秀丸マクロがおもしろくて練習のため2つのマクロを作ってみた

秀丸マクロは、以下のようにキーボード操作の結果を記録して再生することはやっていた。 Shift+F1:キー操作の記録開始/終了 Shift+F2:キー操作の再生 テキストファイル1行分のテキスト編集操 …

Hyper-Vのvhdxを圧縮するのはPowerShellでやるんだけど、その自動化手法がおもしろいじゃん(2)

Hyper-Vのvhdxを圧縮するのはPowerShellでやるんだけど、その自動化手法がおもしろいじゃんの続き。以下2点の改修をしたスクリプトを作ってみた。 ・vhdファイルが存在しなければ、エラー …

no image

円周率

3.1415926535…。私が記憶しているのはここまでです。スーパーコンピュータを使って数億桁まで計算、なんてニュースをよく聞きますね。コンピュータの性能向上とアルゴリズムの工夫に対する …