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

デバイスコンテキスト

デバイスコンテキストとは何かを調べてみた。 Device Context=装置の状況。直訳すると意味わからん。状況という言葉があいまいで、背景・場面・状況・文脈という意味があるが、やっぱわからないこと …

特定サーバーにアクセスするためのIDと一致するものだけを許容するプログラムをつくるには(1)

Windowsで動作させるC#のプログラムの話で、特定サーバーにアクセスするためのIDと一致するものだけを許容するプログラムを作ろうとしていて、なかなか難航したのでその記録を残しておく。ようするに、I …

no image

レイヤ付きPDFを出力する弊害

Illustratorという高価なアプリを使ってPDFを出力すると、PDFにレイヤが付いてしまって非表示にしたはずのレイヤが表示されて困ったなという事象に2回遭遇したので以下に記録。共通しているのが、 …

電子印鑑のつくり方

PDFアレコレで捺印ができるようにしたわけだけど、PDFアレコレで印鑑を作ることはできない。別途つくったpdfまたはpngをnatsuinフォルダに入れておけば、捺印時にそいつらが指定可能になる。 電 …

PDFアレコレをVer3としてリニューアルしたのは、GUI操作をちゃんできるようにしたかったからだ

PDFアレコレをVer3としてリニューアル。 Ver3.00 2020/5/24 ・起動画面をプレビュー画面(PDFの描画画面)に変更して、起動画面からすべての操作(画像変換・ページ編集・テキスト抽出 …