diskpartは、Windowsに標準搭載されたディスク管理ツールです。GUIの「ディスクの管理」ではできない操作(ボリュームの非表示化・VHD作成・スクリプトによる無人セットアップ)をコマンドラインから実行できます。
「新しいPCを10台セットアップするたびに手動でパーティションを切っている」「USBドライブを毎回同じ構成でフォーマットしている」—そういった繰り返し作業をdiskpart /s スクリプト.txtで完全自動化できます。
本記事ではdiskpartの主要コマンドを体系的に整理し、バッチファイルとの組み合わせによる実践的な自動化パターンを解説します。
diskpartで誤ったディスクを選択するとデータが消去されます(元に戻せません)。スクリプト実行前に必ず対象ディスク番号を確認してください。本番環境での実行は特に慎重に行い、事前にバックアップを取ることを強く推奨します。
diskpartとは
diskpartはWindows 2000以降に標準搭載されたディスクパーティション操作ツールです。従来のfdiskの後継として位置づけられており、次の操作が可能です。
- ディスクの初期化(MBR/GPT形式変換)
- パーティションの作成・削除・拡張・縮小
- フォーマット(NTFS/FAT32/exFAT)
- ドライブ文字の割り当て・変更・削除
- ボリュームの非表示化(ドライブ文字なし)
- VHD/VHDX(仮想ハードディスク)の作成・マウント・アンマウント
- ディスクの属性変更(読み取り専用・ブート不可など)
対話型モードとスクリプト実行
diskpartには2つの実行方法があります。
| 方法 | コマンド | 用途 |
|---|---|---|
| 対話型モード | diskpart(引数なし) |
手動で確認しながら操作する |
| スクリプト実行 | diskpart /s スクリプト.txt |
バッチから自動実行する |
@echo off
:: diskpartスクリプトをherestring的にTEMPに書き出して実行
(
echo list disk
echo list volume
) > "%TEMP%\dp_check.txt"
diskpart /s "%TEMP%\dp_check.txt"
del "%TEMP%\dp_check.txt"
diskpartの実行には管理者権限が必要です。標準ユーザーで実行するとエラーになります。バッチファイルで管理者権限を自動取得する方法と組み合わせることで、ダブルクリックで自動昇格させることができます。ディスク・ボリューム情報の確認と読み方
操作前に必ず現在のディスク構成を確認してください。
DISKPART> list disk ディスク 状態 サイズ 空き Dyn Gpt ------------ ------------- ------- ----- --- --- ディスク 0 オンライン 476 GB 0 B * ディスク 1 オンライン 931 GB 931 GB * ディスク 2 オンライン 58 GB 58 GB
| 列 | 内容 |
|---|---|
| ディスク番号 | 操作時に使う番号(select disk NのN) |
| 状態 | オンライン/オフライン。通常はオンライン |
| 空き | 未割り当て領域のサイズ。「0 B」は全領域がパーティション済み |
| Dyn | 「*」はダイナミックディスク(通常はベーシックディスクなので空欄) |
| Gpt | 「*」はGPT形式。空欄はMBR形式 |
DISKPART> list volume Volume ### Ltr Label Fs Type Size Status Info ---------- --- ----------- ----- ---------- ------- --------- -------- Volume 0 C Windows NTFS Partition 475 GB 正常 ブート Volume 1 EFI FAT32 Partition 100 MB 正常 システム Volume 2 D DATA NTFS Partition 931 GB 正常 Volume 3 E FAT32 Removable 58 GB 正常
「Info」列の意味:ブートは現在起動中のOSがあるボリューム、システムはEFI/ブートローダーが入っているボリューム、Hiddenまたは空欄は通常データ領域です。
GPT vs MBR:どちらを選ぶか
| 項目 | MBR | GPT |
|---|---|---|
| 最大ディスクサイズ | 2TB | 18EB(事実上無制限) |
| 最大パーティション数 | 4つ(プライマリ)※拡張パーティション使用で増加可 | 128個 |
| UEFI対応 | BIOS必須(Legacy) | UEFI必須 |
| 障害耐性 | パーティション情報が先頭のみ→壊れると復旧困難 | パーティション情報を先頭と末尾に二重保存 |
| Windows対応 | Windows XP以降 | Windows Vista以降(64bit版) |
| Windows 11での位置づけ | 古いPC向け(非推奨) | 標準・推奨 |
新規でディスクを初期化する場合はGPTを選択してください。2TB以下のディスクでも、Windows 11のUEFI環境・将来の拡張性・障害耐性の観点からGPTが推奨です。MBRを選ぶのは古いPC(BIOS/Legacy環境)との互換性が必要な場合のみです。
主要コマンド一覧
オブジェクト選択・確認コマンド
| コマンド | 内容 |
|---|---|
list disk |
ディスク一覧(番号・サイズ・空き・MBR/GPT) |
list volume |
ボリューム一覧(番号・ドライブ文字・ラベル・FS・サイズ) |
list partition |
選択中ディスクのパーティション一覧 |
list vdisk |
VHD/VHDX一覧 |
select disk N |
ディスク番号Nを選択 |
select volume N |
ボリューム番号Nを選択(ドライブ文字でも指定可: select volume C) |
select partition N |
パーティション番号Nを選択 |
detail disk |
選択ディスクの詳細情報 |
detail volume |
選択ボリュームの詳細情報 |
detail partition |
選択パーティションの詳細情報 |
ディスク操作コマンド
| コマンド | 内容 |
|---|---|
clean |
パーティションテーブルを消去(高速・先頭/末尾セクターのみ) |
clean all |
全セクターを0書きして完全消去(時間がかかる) |
convert mbr |
GPT → MBR 変換(パーティションが全て削除される) |
convert gpt |
MBR → GPT 変換(パーティションが全て削除される) |
convert dynamic |
ベーシック → ダイナミックディスク変換 |
パーティション・ボリューム操作コマンド
| コマンド | 内容 |
|---|---|
create partition primary [size=N] |
プライマリパーティション作成(NはMB単位。省略で最大) |
create partition extended [size=N] |
拡張パーティション作成(MBRのみ) |
create partition logical [size=N] |
論理パーティション作成(拡張パーティション内) |
format fs=ntfs label="名前" quick |
クイックフォーマット(ntfs/fat32/exfat) |
assign letter=X |
ドライブ文字Xを割り当て |
remove letter=X |
ドライブ文字Xを削除 |
delete partition [override] |
パーティション削除(overrideで保護パーティションも削除可) |
extend [size=N] |
パーティションを拡張(省略で最大まで) |
shrink [desired=N] |
パーティションを縮小(NはMB単位の縮小量) |
active |
選択パーティションをアクティブ(ブータブル)に設定 |
inactive |
アクティブフラグを解除 |
ディスク情報をファイルに保存する
@echo off
set OUT=C:\logs\disk_info_%COMPUTERNAME%_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.txt
if not exist C:\logs mkdir C:\logs
(
echo list disk
echo list volume
echo exit
) | diskpart > "%OUT%"
echo ディスク情報を保存しました: %OUT%
type "%OUT%"
より詳しいディスク空き容量の取得(変数への格納・GB換算)にはwmicコマンドのwmic logicaldiskが便利です。
USBドライブのフォーマット
USBドライブのディスク番号は環境によって異なります。上記の
list diskでサイズ列を見てUSBに該当するディスク番号を特定してからDISK_NUMを設定してください。FAT32でフォーマット(汎用USBドライブ)
@echo off
setlocal
:: !! 重要: diskpart list disk でUSBのディスク番号を確認してから実行 !!
set DISK_NUM=1
echo ディスク %DISK_NUM% をFAT32でフォーマットします。
echo このディスクの全データが消去されます。
set /p CONFIRM=続行しますか? [y/N]:
if /i not "%CONFIRM%"=="y" (
echo キャンセルしました。
exit /b 0
)
(
echo select disk %DISK_NUM%
echo clean
echo create partition primary
echo format fs=fat32 label="USB" quick
echo assign
echo exit
) > "%TEMP%\dp_usb.txt"
diskpart /s "%TEMP%\dp_usb.txt"
del "%TEMP%\dp_usb.txt"
if %errorlevel% equ 0 (
echo フォーマット完了しました。
) else (
echo エラーが発生しました。管理者権限で実行しているか確認してください。
)
exFATでフォーマット(4GB超ファイル対応)
@echo off
setlocal
set DISK_NUM=1
set LABEL=DATA
(
echo select disk %DISK_NUM%
echo clean
echo create partition primary
echo format fs=exfat label="%LABEL%" quick
echo assign
echo exit
) > "%TEMP%\dp_exfat.txt"
diskpart /s "%TEMP%\dp_exfat.txt"
del "%TEMP%\dp_exfat.txt"
FAT32: 互換性が最高(家電・カーナビ等でも読める)。1ファイルの上限4GB。
exFAT: 4GB超のファイルに対応。WindowsとmacOSで読み書き可能。現代のUSB用途に最適。
NTFS: Windows専用(macOSでは読み取り専用)。ACL・圧縮・暗号化対応。企業内PC間でのデータ共有向け。
新規ディスクの初期設定(GPT/NTFS)
新しく追加したHDD/SSDをGPT方式でNTFSフォーマットする標準的なパターンです。
@echo off
setlocal
:: !! 正しいディスク番号を指定(list diskで確認)!!
set DISK_NUM=2
set DRIVE_LETTER=D
set LABEL=DATA
(
echo select disk %DISK_NUM%
echo clean
echo convert gpt
echo create partition primary
echo format fs=ntfs label="%LABEL%" quick
echo assign letter=%DRIVE_LETTER%
echo exit
) > "%TEMP%\dp_new_gpt.txt"
diskpart /s "%TEMP%\dp_new_gpt.txt"
del "%TEMP%\dp_new_gpt.txt"
if %errorlevel% equ 0 (
echo セットアップ完了: %DRIVE_LETTER%ドライブ(%LABEL%)
) else (
echo セットアップに失敗しました。
)
複数パーティション構成(システム用+データ用)
システム領域とデータ領域を別パーティションに分割する構成のサンプルです。OS再インストール時にデータ領域を保持したい場合に有効です。
@echo off
setlocal
set DISK_NUM=2
set OS_SIZE=102400
:: ^^ システム用: 100GB(MB単位)
:: データ用は残り全部(size省略で自動)
(
echo select disk %DISK_NUM%
echo clean
echo convert gpt
echo :: --- システム用パーティション ---
echo create partition primary size=%OS_SIZE%
echo format fs=ntfs label="System" quick
echo assign letter=C
echo :: --- データ用パーティション(残り全領域)---
echo create partition primary
echo format fs=ntfs label="Data" quick
echo assign letter=D
echo exit
) > "%TEMP%\dp_multi.txt"
diskpart /s "%TEMP%\dp_multi.txt"
del "%TEMP%\dp_multi.txt"
diskpartスクリプトファイル内では
::行は無視されません。::はdiskpartに認識されないコマンドとして実行され、エラーになる場合があります。コメントを残したい場合はバッチ側のコメントとして管理し、diskpartに渡すスクリプトからはコメント行を除くのが安全です。パーティションの拡張・縮小・削除
パーティションを最大サイズに拡張
@echo off
:: ボリュームCを拡張可能な最大サイズまで拡張
(
echo select volume C
echo extend
echo exit
) > "%TEMP%\dp_extend.txt"
diskpart /s "%TEMP%\dp_extend.txt"
del "%TEMP%\dp_extend.txt"
:: 10GBだけ拡張する場合
:: extend size=10240
パーティションを縮小する
Cドライブを縮小して新しいパーティション用の領域を確保するパターンです。縮小後に未割り当て領域が生まれ、新しいパーティションを作れるようになります。
@echo off
:: Cドライブを50GB縮小する
set SHRINK_MB=51200
(
echo select volume C
echo shrink desired=%SHRINK_MB%
echo exit
) > "%TEMP%\dp_shrink.txt"
diskpart /s "%TEMP%\dp_shrink.txt"
del "%TEMP%\dp_shrink.txt"
:: 縮小可能な最大サイズを調べるだけの場合(実際には縮小しない)
:: shrink querymax
ドライブ文字の変更
@echo off
:: ボリュームEのドライブ文字をFに変更する
(
echo select volume E
echo remove letter=E
echo assign letter=F
echo exit
) > "%TEMP%\dp_letter.txt"
diskpart /s "%TEMP%\dp_letter.txt"
del "%TEMP%\dp_letter.txt"
パーティションの削除
@echo off
:: !! データが消えるため対象を必ず確認 !!
:: ディスク1のパーティション2を削除する例
(
echo select disk 1
echo select partition 2
echo delete partition
echo exit
) > "%TEMP%\dp_del.txt"
diskpart /s "%TEMP%\dp_del.txt"
del "%TEMP%\dp_del.txt"
:: システム/保護パーティションを削除する場合は override を追加
:: delete partition override
VHD/VHDX(仮想ハードディスク)の操作
VHD(Virtual Hard Disk)はWindowsが標準でサポートする仮想ディスクファイルです。バックアップ領域の確保・テスト環境の構築・ポータブルデータ領域として活用できます。ファイルを削除するだけでディスクを丸ごと廃棄できるため、管理が非常に楽です。
| 形式 | 最大サイズ | 対応OS | 推奨度 |
|---|---|---|---|
| VHD | 2TB | Windows Vista以降 | 古いPCとの互換性が必要な場合 |
| VHDX | 64TB | Windows 8/Server 2012以降 | 現代の環境では推奨 |
VHDXファイルの作成とマウント
@echo off
setlocal
set VHD_PATH=C:\VHDs\backup.vhdx
set VHD_SIZE=51200
:: ^^ 50GB(MB単位)。expandableなら実際はデータ分だけ消費
set DRIVE_LETTER=V
if not exist C:\VHDs mkdir C:\VHDs
(
echo create vdisk file="%VHD_PATH%" maximum=%VHD_SIZE% type=expandable
echo select vdisk file="%VHD_PATH%"
echo attach vdisk
echo create partition primary
echo format fs=ntfs label="BACKUP" quick
echo assign letter=%DRIVE_LETTER%
echo exit
) > "%TEMP%\dp_vhdx_create.txt"
diskpart /s "%TEMP%\dp_vhdx_create.txt"
del "%TEMP%\dp_vhdx_create.txt"
if %errorlevel% equ 0 (
echo VHD作成・マウント完了: %DRIVE_LETTER%ドライブ
)
既存VHD/VHDXのマウント・アンマウント
@echo off
setlocal
set VHD_PATH=C:\VHDs\backup.vhdx
:mount
(
echo select vdisk file="%VHD_PATH%"
echo attach vdisk
echo exit
) > "%TEMP%\dp_mount.txt"
diskpart /s "%TEMP%\dp_mount.txt"
del "%TEMP%\dp_mount.txt"
echo マウント完了
goto :eof
:unmount
(
echo select vdisk file="%VHD_PATH%"
echo detach vdisk
echo exit
) > "%TEMP%\dp_umount.txt"
diskpart /s "%TEMP%\dp_umount.txt"
del "%TEMP%\dp_umount.txt"
echo アンマウント完了
読み取り専用でVHDをマウント(スナップショット参照)
@echo off
:: 読み取り専用でマウントするとファイルを変更しても内容が保存されない
set VHD_PATH=C:\Snapshots\snap_20250101.vhdx
(
echo select vdisk file="%VHD_PATH%"
echo attach vdisk readonly
echo exit
) > "%TEMP%\dp_ro.txt"
diskpart /s "%TEMP%\dp_ro.txt"
del "%TEMP%\dp_ro.txt"
実践パターン
パターン1: 複数USBドライブの一括フォーマット
PC展開作業などで大量のUSBドライブを同じ構成でフォーマットするパターンです。ディスク番号リストに対してループ処理します。
@echo off
setlocal enabledelayedexpansion
:: !! 必ずdiskpart list diskで事前確認すること !!
set DISK_LIST=1 2 3
set LABEL=COMPANY_USB
set LOG=C:\logs\format_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.txt
if not exist C:\logs mkdir C:\logs
for %%d in (%DISK_LIST%) do (
echo [%%d] フォーマット開始: %DATE% %TIME% >> "%LOG%"
echo ディスク %%d をフォーマット中...
(
echo select disk %%d
echo clean
echo create partition primary
echo format fs=fat32 label="%LABEL%" quick
echo assign
echo exit
) > "%TEMP%\dp_bulk_%%d.txt"
diskpart /s "%TEMP%\dp_bulk_%%d.txt" >> "%LOG%" 2>&1
del "%TEMP%\dp_bulk_%%d.txt"
if !errorlevel! equ 0 (
echo [%%d] 完了 >> "%LOG%"
echo ディスク %%d 完了
) else (
echo [%%d] エラー >> "%LOG%"
echo ディスク %%d エラー
)
)
echo 処理終了。ログ: %LOG%
パターン2: VHDを使った定期バックアップ領域作成
日付付きのVHDXファイルを作成し、ROBOCOPYでバックアップを書き込むパターンです。VHDXは.vhdxファイルを削除するだけで完全消去できるため世代管理が楽です。
@echo off
setlocal
set DATE_STR=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
set VHD_PATH=E:\Backups\backup_%DATE_STR%.vhdx
set VHD_SIZE=102400
:: ^^ 100GB(実際の使用量は最大でこのサイズ、expandableなので普段は少ない)
set MOUNT_LETTER=Z
set SRC=C:\Users
set LOG=C:\logs\backup_%DATE_STR%.log
:: VHDXを作成してマウント
(
echo create vdisk file="%VHD_PATH%" maximum=%VHD_SIZE% type=expandable
echo select vdisk file="%VHD_PATH%"
echo attach vdisk
echo create partition primary
echo format fs=ntfs label="BK_%DATE_STR%" quick
echo assign letter=%MOUNT_LETTER%
echo exit
) > "%TEMP%\dp_bk.txt"
diskpart /s "%TEMP%\dp_bk.txt"
del "%TEMP%\dp_bk.txt"
:: ROBOCOPYでバックアップ
robocopy "%SRC%" "%MOUNT_LETTER%:\Users" /e /xjd /r:1 /w:3 /log:"%LOG%"
:: アンマウント
(
echo select vdisk file="%VHD_PATH%"
echo detach vdisk
echo exit
) > "%TEMP%\dp_umount.txt"
diskpart /s "%TEMP%\dp_umount.txt"
del "%TEMP%\dp_umount.txt"
echo バックアップ完了: %VHD_PATH%
パターン3: ディスク構成の資産管理レポート
diskpartとwmicを組み合わせてディスク構成をファイルに記録します。タスクスケジューラで定期実行すれば自動的に台帳が更新されます。
@echo off
setlocal
set OUT=C:\logs\disk_inv_%COMPUTERNAME%_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.txt
if not exist C:\logs mkdir C:\logs
(
echo === ディスク構成レポート ===
echo PC: %COMPUTERNAME%
echo 収集日時: %DATE% %TIME%
echo.
echo [物理ディスク一覧(diskpart)]
) > "%OUT%"
(
echo list disk
echo list volume
echo exit
) | diskpart >> "%OUT%"
echo. >> "%OUT%"
echo [ドライブ空き容量(wmic)] >> "%OUT%"
wmic logicaldisk get DeviceID,VolumeName,FreeSpace,Size /format:csv >> "%OUT%"
echo レポート作成完了: %OUT%
パターン4: 新PC一括セットアップスクリプト
PC展開時にディスク初期化・パーティション作成・ACL設定まで自動化するフルセットアップスクリプトです。実行後にicaclsコマンドでアクセス権を設定するステップを組み合わせます。
@echo off
setlocal
:: !! 実行前にlist diskで各ドライブのディスク番号を必ず確認 !!
set OS_DISK=0
set DATA_DISK=1
echo === ディスクセットアップ開始 ===
:: --- データディスクの初期化 ---
echo データディスク(ディスク%DATA_DISK%)を初期化...
(
echo select disk %DATA_DISK%
echo clean
echo convert gpt
echo create partition primary
echo format fs=ntfs label="DATA" quick
echo assign letter=D
echo exit
) > "%TEMP%\dp_setup.txt"
diskpart /s "%TEMP%\dp_setup.txt"
del "%TEMP%\dp_setup.txt"
if %errorlevel% neq 0 (
echo [ERROR] ディスクセットアップに失敗しました。
exit /b 1
)
:: --- フォルダ作成 ---
mkdir D:\Work 2>nul
mkdir D:\Logs 2>nul
mkdir D:\Backups 2>nul
:: --- アクセス権設定(icacls) ---
icacls D:\Work /grant "Users:(OI)(CI)M" /T >nul
icacls D:\Logs /grant "Users:(OI)(CI)M" /T >nul
echo === セットアップ完了 ===
echo Dドライブ(DATA)が使用可能になりました。
よくあるエラーと対処
| エラー・症状 | 原因 | 対処 |
|---|---|---|
| 「管理者として実行する必要があります」 | 管理者権限なし | コマンドプロンプトを「管理者として実行」で起動。自動昇格バッチと組み合わせると便利 |
| 「選択したディスクには保護されたパーティションがあります」 | システム/回復パーティションが含まれる | delete partition overrideを使う(OS起動に影響するパーティションは削除しないこと) |
| formatが非常に遅い | quickを指定していない |
format fs=ntfs quickのようにquickを追加する |
| VHD作成で「ディスク容量が不足しています」 | 保存先ドライブの空き容量不足 | 保存先ドライブの空き容量を確認。type=expandableなら実際は少ない容量しか消費しない |
| assign後にドライブが表示されない | フォーマットが未完了 | create partition → format → assignの順を守る。formatを忘れるとドライブが表示されない |
| ディスク番号が変わってしまう | USBの抜き差しや再起動でディスク番号が変動 | スクリプト実行前に必ずlist diskで番号を確認する |
shrinkで縮小できる量が少ない |
断片化やシステムファイルが末尾にある | デフラグ後にshrink querymaxで最大縮小量を確認する。またはclean allで全消去してから再パーティション |
スクリプト内の::でエラー |
diskpartがコロン2つをコマンドとして解釈しようとする | diskpartスクリプトファイル内にコメントは書かない。コメントはバッチ側で管理する |
USBドライブを抜き差しするたびに
list diskのディスク番号が変わることがあります。固定番号でスクリプトを組むと、意図しないディスクを操作してしまう危険があります。自動化する際は必ず実行前にlist diskでオペレーターに番号確認を促す一時停止ステップを入れてください。よくある質問
select disk 0を書く際は特に注意が必要です。安全策として、スクリプトの冒頭でlist diskを実行して一時停止し、オペレーターに番号確認させるステップを必ず入れることをお勧めします。%TEMP%に一時作成して実行後に削除するパターンが一般的です。複数スクリプトが競合しないようファイル名にディスク番号や日時を含めると安全です。cleanはパーティションテーブルと先頭・末尾のセクターを消去するだけで高速(数秒)です。clean allはディスク全体を0で上書きするため完全消去になりますが、容量によっては数時間かかります。通常の初期化はcleanで十分で、廃棄時のデータ消去目的ならclean allを使います。まとめ
diskpart /s スクリプトファイルを使えば、通常は手動操作が必要なディスク管理を完全自動化できます。
本記事のポイントをまとめます。
- スクリプト実行は
diskpart /s ファイル.txt: TEMPに一時ファイルを作成して実行後削除が定番パターン - 実行前に必ず
list diskでディスク番号を確認: 番号は環境・タイミングで変わる。誤操作防止が最優先 - 現代のPC環境はGPT一択: 2TB超対応・128パーティション・障害耐性の観点で優れる
- ファイルシステム選択: 汎用USB→FAT32、4GB超→exFAT、Windowsのみ→NTFS
- VHDXはポータブルな仮想ディスク: バックアップ・テスト環境に使いやすく、ファイル削除で完全廃棄できる
- diskpartスクリプト内にコメント(::)は書かない: diskpartが認識できずエラーになる場合がある
- ログを必ず残す:
diskpart /s file.txt >> log.txtで実行結果を記録しログ管理と組み合わせる

