【.bat】特定のフォルダ配下にあるサブフォルダのサイズを計算して、ファイルにリスト出力するバッチコード
このバッチファイルは、「Windowsのコマンドプロンプト(Batch)からPowerShellを呼び出し、特定のフォルダ配下にあるサブフォルダのサイズを計算して、ファイルにリスト出力する」という機能を持っています。
@echo off
setlocal
set "OUTPUT_FILE=folder_size_list.txt"
set "TARGET_DIR=."
echo 処理を開始します...
powershell -NoProfile -ExecutionPolicy Bypass -Command ^
"$targetDir = '%TARGET_DIR%'; $outputFile = '%OUTPUT_FILE%'; " ^
"$results = Get-ChildItem -Path $targetDir -Directory | ForEach-Object { " ^
" $size = (Get-ChildItem -Path $_.FullName -Recurse -File -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum; " ^
" [PSCustomObject]@{ " ^
" Name = $_.Name; " ^
" SizeMB = if ($size) { [math]::Round($size / 1MB, 2) } else { 0 }; " ^
" } " ^
"} | Sort-Object -Property SizeMB -Descending; " ^
"$sb = [System.Text.StringBuilder]::new(); " ^
"[void]$sb.AppendLine('=' * 60); " ^
"[void]$sb.AppendLine(('FOLDER NAME').PadRight(50) + ' : SIZE'); " ^
"[void]$sb.AppendLine('=' * 60); " ^
"$results | ForEach-Object { [void]$sb.AppendLine($_.Name.PadRight(50) + ' : ' + $_.SizeMB.ToString('N2') + ' MB') }; " ^
"$sb.ToString() | Out-File -FilePath $outputFile -Encoding Default;"
echo 処理が完了しました。
pause
処理の全体的な流れは以下の通りです。
詳細なコード解説
コードの役割を大きく分けて説明します。
1. バッチファイル側の設定 (前半)
コード スニペット
@echo off :: コマンドの画面表示をオフ
setlocal :: 変数の環境をローカルに閉じる
set "OUTPUT_FILE=folder_size_list.txt" :: 出力ファイル名
set "TARGET_DIR=." :: 調べる対象フォルダ('.'は現在のフォルダ)
ここで出力するファイル名と、調査する場所を設定しています。
2. PowerShellの呼び出しとデータ収集
PowerShell
powershell -NoProfile -ExecutionPolicy Bypass -Command ^
...
powershell コマンドを使って、別プログラム(PowerShell)に処理を依頼しています。
Get-ChildItem -Path $targetDir -Directory: 指定したフォルダ内にあるフォルダだけを取得します。ForEach-Object { ... }: 取得したフォルダの数だけ繰り返し処理を行います。
3. フォルダサイズの計算 (コア処理)
PowerShell
$size = (Get-ChildItem -Path $_.FullName -Recurse -File -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum;
ここが重要です。
- 各フォルダの深い階層までファイルを調べます (
-Recurse)。 - ファイルだけを対象にします (
-File)。 - エラー(アクセス拒否など)は無視して先に進みます (
-ErrorAction SilentlyContinue)。 - すべてのファイルの合計サイズ (
Length) を計算します (Measure-Object -Sum)。
4. データの整形とソート
PowerShell
[PSCustomObject]@{
Name = $_.Name;
SizeMB = if ($size) { [math]::Round($size / 1MB, 2) } else { 0 };
}
ファイルサイズはバイト単位で計算されるため、それをメガバイト(1MB)で割って四捨五入しています。 その結果を Sort-Object -Property SizeMB -Descending で、サイズの大きい順に並べ替えています。
5. ファイルへの出力処理
PowerShell
$sb = [System.Text.StringBuilder]::new();
[void]$sb.AppendLine('=' * 60);
...
$sb.ToString() | Out-File -FilePath $outputFile -Encoding Default;
メモリ上でテキスト(ヘッダーと順位データ)を作成し、最後にまとめて Out-File でファイルに書き込んでいます。これが一番効率的です。
まとめ
このバッチファイルをダブルクリックして実行すると、以下のことが行われます。
- ファイルがある場所に
folder_size_list.txtが作成される。 - 中のフォルダサイズが計算される。
- 大きいフォルダ順に並べ替えられ、ファイルに書き込まれる。


