【.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;

ここが重要です。

  1. 各フォルダの深い階層までファイルを調べます (-Recurse)。
  2. ファイルだけを対象にします (-File)。
  3. エラー(アクセス拒否など)は無視して先に進みます (-ErrorAction SilentlyContinue)。
  4. すべてのファイルの合計サイズ (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 でファイルに書き込んでいます。これが一番効率的です。


まとめ

このバッチファイルをダブルクリックして実行すると、以下のことが行われます。

  1. ファイルがある場所に folder_size_list.txt が作成される。
  2. 中のフォルダサイズが計算される。
  3. 大きいフォルダ順に並べ替えられ、ファイルに書き込まれる。

\ 最新情報をチェック /