DiskPart の list vdisk に、削除したはずの VHD/VHDX が残り続けて数千件になることがあります。原因は「切り離し」と「削除」の違いと、OS セッション内の記録にあります。再起動での解消や運用のコツをまとめます。
起きている現象:detach vdisk しても list vdisk が増え続ける
DiskPart(ディスクパート)で差分ディスク(differencing disk)などの VHD/VHDX を大量に作成し、接続しては削除する運用をしていると、次のような状態に遭遇することがあります。
- DiskPart で
detach vdiskを実行すると、ディスクの管理(diskmgmt.msc)からは消える - 実体の VHD/VHDX ファイルも削除した
- しかし DiskPart の
list vdiskには、過去に接続した仮想ディスクが延々と残り続け、数千件に増える
この挙動は「ファイルが残っている」こととイコールではありません。見えているのは“いま接続中のディスク一覧”というより、OS の稼働セッション中に作られた仮想ディスク管理の痕跡が、DiskPart 側の一覧に残っているように見える状態です。
よくある表示例(イメージ)
DISKPART> list vdisk
VDisk ### Disk ### State Type File
---
VDisk 0 Disk 3 Detached Expandable C:\temp\test001.vhdx
VDisk 1 Disk 4 Detached Differencing C:\temp\diff002.vhdx
...(削除済みのはずのパスが大量に続く)...
まず押さえる:detach vdisk は「切り離し」であって「削除」ではない
混乱の起点になりやすいのが、DiskPart の detach vdisk がやっていることです。これはあくまで “OS から仮想ディスクを切り離す(アンマウントする)” 操作であり、VHD/VHDX ファイル自体を削除する操作ではありません。
| 操作 | 対象 | 主な効果 | 補足 |
|---|---|---|---|
detach vdisk | 仮想ディスクの接続状態 | OS から切り離す(見えなくする) | ファイルは残る。削除は別途必要 |
Explorer で削除 / Remove-Item | VHD/VHDX ファイル | 物理ファイルを削除 | 接続中だと失敗することが多い |
Dismount-VHD(Hyper-V) | 仮想ディスクの接続状態 | PowerShell で切り離す | Hyper-V モジュールが必要な環境がある |
Dismount-DiskImage(Storage) | ディスクイメージ | ISO/VHD などを切り離す | Windows 標準の Storage 系 cmdlet |
Remove-VirtualDisk | Storage Spaces の仮想ディスク | 記憶域スペースの構成を削除 | VHD/VHDX の“マウント履歴”とは別物 |
つまり、運用としては次の順番が基本です。
- (必要なら)
detach vdiskで切り離す - VHD/VHDX ファイルを削除する(Explorer / PowerShell)
結論:list vdisk に残る“過去の接続”は、再起動でクリアされることが多い
質問の本丸である「ファイルは消えているのに list vdisk に残る」現象は、環境によって差はあるものの、再起動で一掃されるケースが非常に多いです。これは、一覧が永続ストレージに記録されているというより、OS の稼働セッション(起動してから再起動するまで)で保持される管理情報が表示されている挙動と整合します。
そのため、確実に一覧をきれいにしたい場合は、最も確実な解決策は OS の再起動です。大量に溜まってしまった場合でも、再起動後に list vdisk が正常な件数に戻るなら、実体ファイルの残骸が増え続けているわけではありません。
この情報はどこに保存されているのか
「どこかのフォルダやレジストリに履歴が溜まっているのでは?」と疑いたくなりますが、再起動で消える挙動から考えると、少なくとも “ユーザーが掃除できるファイルとして永続保存されている” 可能性は高くありません。
より実務的には、次のように整理しておくのが安全です。
- VHD/VHDX の実体:ファイルシステム上の
.vhd/.vhdx(ここは自分で削除できる) - 接続状態:OS が「この VHD/VHDX を仮想ディスクとして扱っている」状態(切り離しで消える)
list vdiskの残り:OS セッション中の管理情報が DiskPart の列挙対象として残っているように見える(再起動で消えることが多い)
なお、Windows にはドライブレターの割り当てなどを保持する仕組みがあり、これらはレジストリ(例:HKLM\SYSTEM\MountedDevices)に残ります。ただし、これは「どのボリュームにどのドライブレターを割り当てるか」という話で、今回の list vdisk の“過去接続の大量残り”を掃除する目的で触るべき場所ではありません。レジストリ編集は影響範囲が大きく、問題の切り分けを難しくします。
完全に消して list vdisk に出ないようにする手順
実務で困るのは「本当に削除できているのか」「一覧の残りは害があるのか」という不安です。ここでは “実体が消えている” ことを確実にし、必要なら一覧もリセットするまでの流れを、チェックポイント付きでまとめます。
手順:いま接続されていないことを確認する
まずは「まだどこかでマウント中」という事故を潰します。DiskPart でも PowerShell でも構いません。
DiskPart で確認
diskpart
list vdisk
select vdisk file="C:\path\to\target.vhdx"
detail vdisk
detach vdisk
detail vdisk で状態が Attached のままなら、まず切り離しが先です。切り離しに失敗する場合は、どこかのプロセスが VHD/VHDX を掴んでいる可能性があります(後述)。
PowerShell で確認(Storage モジュール)
# 接続状態の確認(VHD/VHDX でも使える)
Get-DiskImage -ImagePath "C:\path\to\target.vhdx" | Format-List *
# 切り離し
Dismount-DiskImage -ImagePath "C:\path\to\target.vhdx"
Hyper-V 管理用のモジュールが入っている環境なら、次の cmdlet も使えます。
# Hyper-V モジュールがある場合
Dismount-VHD -Path "C:\path\to\target.vhdx"
手順:VHD/VHDX の物理ファイルを削除する
切り離しができたら、実体ファイルを削除します。大量に作っては消す運用の場合、Explorer の手作業はミスが起きやすいので、PowerShell でログを残しながら消すのがおすすめです。
# 存在確認
Test-Path "C:\temp\target.vhdx"
# 削除(必要なら -Force)
Remove-Item "C:\temp\target.vhdx" -Force
差分ディスク(differencing disk)を扱っている場合は、親ディスク(ベース)を誤って消さないことが重要です。差分ディスクは親の内容を参照して成立しているため、親を消すと差分側が壊れたり、検証の再現性が崩れます。
手順:それでも list vdisk に残るなら再起動する
ファイルを削除し、接続も解除できているのに list vdisk にだけ残る――このパターンは、表示が “履歴のように残っている” だけの可能性が高いです。ここで一覧を完全に初期化したいなら、再起動が最短かつ確実です。
| 状態 | やるべきこと | 目的 |
|---|---|---|
| ディスクの管理に見えている | 切り離し(DiskPart / PowerShell) | 接続中の解消 |
| ファイルが残っている | ファイル削除(Explorer / Remove-Item) | ストレージ消費の解消 |
どちらも消えたが list vdisk にだけ残る | 再起動 | セッション内の残り表示をリセット |
Remove-VirtualDisk が効かない理由:Storage Spaces と VHD/VHDX は別物
PowerShell で「仮想ディスクを削除」と聞くと Remove-VirtualDisk を試したくなりますが、これは主に Storage Spaces(記憶域スペース)の “仮想ディスク” を消すためのコマンドです。VHD/VHDX の「マウント履歴」や DiskPart の一覧を掃除したい意図とは噛み合わないことが多いです。
| 用語 | 何を指すか | 代表的な操作 |
|---|---|---|
| VHD/VHDX | ファイルとして存在する仮想ハードディスク | DiskPart / Mount-DiskImage / Mount-VHD |
| Storage Spaces の Virtual Disk | 物理ディスク群から論理的に切り出した領域 | Get-VirtualDisk / Remove-VirtualDisk |
パフォーマンスへの影響はどの程度?
一番気になるのが「数千件に増えたら OS が重くなるのでは?」という点です。結論から言うと、多くのケースで、影響が出やすいのは管理系コマンドの操作感です。
- 影響が出やすい:
diskpartのlist vdisk実行が遅い、Disk 管理系ツールの列挙がもたつく、ログ収集が重い - 影響が出にくい:通常のファイル I/O、仮想マシンの稼働、ネットワークなど、日常の処理性能全般
理由は単純で、残っているのが「実体ディスクとして常に処理しているもの」ではなく、主に “列挙されるリスト” 側の問題だからです。もちろん、環境・バージョン・同時に動かしているソフトウェアによっては例外もありますが、少なくとも「表示が残っている=ストレージを食っている」という誤解は避けられます。
不安を減らすための確認ポイント
「影響がない」と言われても不安な場合は、次の観点で切り分けると納得しやすいです。
| 確認したいこと | 見方 | 安心できる状態 |
|---|---|---|
| 本当に接続されていないか | ディスクの管理 / Get-DiskImage | 対象 VHD/VHDX が表示されない、Attached ではない |
| 実体ファイルが消えているか | Test-Path / エクスプローラー | ファイルが存在しない |
| “一覧だけ”の問題か | 再起動後の list vdisk | 再起動で件数が減る/消える |
再起動できない場合の現実的な対策
本番サーバーや稼働中の検証環境など、「すぐ再起動」は難しいこともあります。その場合は “表示を消す” ことよりも、実体の削除と接続解除ができているか に焦点を当てるのが安全です。
優先順位:実体ファイル削除 > 接続解除 > 表示の掃除
- まず VHD/VHDX ファイルが削除できていること(ストレージ消費の観点で最重要)
- 次に、接続が残っていないこと(思わぬドライブレターやロックの原因になる)
list vdiskの残りは、上の2つが満たせていれば“表示上の問題”になりやすい
サービス再起動で改善する可能性はあるが、万能ではない
環境によっては、ディスク管理系のサービスを再起動すると列挙が整理されることがあります。ただし、ストレージ関連サービスの再起動は影響範囲が大きく、タイミングを誤ると別のトラブルを呼びます。実行するならメンテナンス時間帯で、影響を理解した上で行ってください。
# 例:Virtual Disk サービス(環境により存在しない/停止できない場合あり)
Restart-Service -Name vds
# 例:Storage Service
Restart-Service -Name StorSvc
これで必ず list vdisk が掃除されるとは限りません。表示が残るときは、やはり再起動が確実です。
大量に VHD/VHDX を作って消す人向け:増やさない運用のコツ
差分ディスクを「作る→接続→検証→切り離し→削除」を何千回も回す運用では、1回の漏れが雪だるま式に増えます。表示の問題に悩まされないために、次の設計にしておくとトラブルが激減します。
“必ず切り離す” をコードで保証する(try/finally)
手作業ではなくスクリプト化しているなら、途中でエラーが起きても必ず切り離すようにします。
$path = "C:\temp\work\test.vhdx"
try {
# 例:接続
Mount-DiskImage -ImagePath $path
# ここで検証処理(例:ドライブの初期化やファイル操作など)
}
finally {
# 例:切り離し(失敗しても次へ進めるため、必要に応じてエラー制御)
Dismount-DiskImage -ImagePath $path -ErrorAction SilentlyContinue
}
この “最後は必ず切り離す” の設計だけで、不要な接続残りや削除失敗が大幅に減ります。
削除対象をフォルダ単位で隔離する
削除対象が散らばると消し漏れが増えます。実験1回ごとに作業フォルダを作り、最後にフォルダごと削除できる構成にすると安全です。
$workDir = "C:\temp\vhd-batch\run-20260101-120000"
New-Item -ItemType Directory -Path $workDir | Out-Null
# ここに差分ディスクを作成していく
# 最後に $workDir を丸ごと消せるようにする
差分ディスクの親(ベース)は“触らない”場所に固定する
親 VHD/VHDX を作業フォルダに置くと誤削除の危険が跳ね上がります。ベースは読み取り専用にしたり、別ボリュームに固定したりして、「消すもの」と「消さないもの」を物理的に分離するのが鉄則です。
トラブルシューティング:よくある詰まりどころ
| 症状 | ありがちな原因 | 対処 |
|---|---|---|
| 削除しようとすると「使用中」で消せない | どこかのプロセスが VHD/VHDX を掴んでいる/切り離し漏れ | 先に切り離し(DiskPart / PowerShell)。それでもダメなら、関連アプリ(Hyper-V、バックアップ、ウイルス対策、エクスプローラーのプレビューなど)を閉じる |
detach vdisk したのに再接続すると差分ディスクが壊れる | 親ディスクの場所変更/親ディスクの誤削除/パス解決の問題 | 親のパスを固定し、差分ディスク作成時の設計を見直す |
ディスクの管理には出ないのに list vdisk に大量に残る | 表示がセッション内の列挙に残っている | 実体削除と接続解除ができているか確認し、必要なら再起動でクリア |
| 再起動しても件数が減らない | 起動時に自動でマウントしている仕組みがある/常駐ソフトが再接続している | スタートアップやタスクスケジューラ、常駐製品の設定を確認。実際に接続中かを優先して切り分ける |
まとめ:不安を最短で解消する考え方
DiskPart の list vdisk に過去の VHD/VHDX が残り続けると、「削除できていないのでは」「システムに悪影響があるのでは」と不安になります。しかし、ポイントは次の3つです。
detach vdiskは切り離しであり、削除ではない(実体の削除は別途必要)- ファイルを削除しても
list vdiskに残ることがあるが、再起動でクリアされることが多い - 影響が出るとしても管理系コマンドの列挙が中心で、実体が消えていれば致命的になりにくい
まずは「接続されていない」「ファイルが消えている」を確認し、それでも一覧が気になる場合は再起動でリセットする――この順番で対応すれば、過剰に悩まずに運用を回せます。

コメント