PowerShellを使用して特定のディレクトリのサイズを確認する方法という問いには、Get-ChildItem -Fileで対象を限定し、合計バイトとファイル数に加えて列挙エラーを別に採取するという方法で答えます。Measure-Object Length -Sumは列挙できたファイルの論理サイズを合計する。割り当て済みサイズ、圧縮、重複除去、再解析ポイントの扱いとは一致しないことがある。この記事ではLiteralPathで固定したルート、ファイルのFullName、Length、最終更新時刻、取得エラーを記録するを判断軸にし、実行前の確認、記事固有のコード、合否判定、戻し方を一続きで示します。
ディスク全体の空き容量ではなく、指定ディレクトリ配下で列挙できたファイルの合計を求める。完了は「ルート、時刻、件数、合計バイト、除外条件、エラー件数が一つの記録にそろう」と定義します。対象が取れない場合は「0バイトなら空フォルダーだけでなく、アクセス拒否、パス違い、フィルター、クラウドのオンライン専用状態を調べる」として切り分け、推測で成功扱いにしません。
集計ルートと再解析ポイントを決める
Get-ChildItem -Fileで対象を限定し、合計バイトとファイル数に加えて列挙エラーを別に採取する。ディレクトリ容量の正確な集計ではこの進め方により、操作したという事実ではなく、期待する状態へ到達したかでタイトルの問いへ答えられます。ディスク全体の空き容量ではなく、指定ディレクトリ配下で列挙できたファイルの合計を求める。
集計ルートと再解析ポイントを決めるの合格条件は、ルート、時刻、件数、合計バイト、除外条件、エラー件数が一つの記録にそろうことです。作業時刻、実行ユーザー、端末名を添え、判断に使った値が後から追える形にします。
ファイルだけのLengthを合計
ファイルだけのLengthを合計では、ディレクトリ容量の正確な集計の対象を「LiteralPathで固定したルート、ファイルのFullName、Length、最終更新時刻、取得エラーを記録する」という単位で扱います。Measure-Object Length -Sumは列挙できたファイルの論理サイズを合計する。割り当て済みサイズ、圧縮、重複除去、再解析ポイントの扱いとは一致しないことがある。対象が複数なら表示名の部分一致で先頭を採らず、一意になる条件を追加します。
ディレクトリ容量の正確な集計を始める前に、PowerShellの版、コマンドの提供元、必要権限、管理ポリシーの有無を確認します。権限不足と対象なしは意味が異なるため、例外を0件へ置き換えません。
アクセス拒否を黙って欠落させない
アクセス拒否を黙って欠落させないは変更前の基準点です。LiteralPathで固定したルート、ファイルのFullName、Length、最終更新時刻、取得エラーを記録するを出力に含め、取得時刻と一緒に保存します。値だけを切り取ると別対象との比較になるため、識別列を省きません。
$target = 'C:\Ops\Logs'
$enumerationErrors = @()
$files = @(Get-ChildItem -LiteralPath $target -File -Force -Recurse -ErrorAction SilentlyContinue -ErrorVariable +enumerationErrors)
$measure = $files | Measure-Object -Property Length -Sum
$summary = [pscustomobject]@{
Root=$target; CollectedAt=Get-Date; Files=$measure.Count
Bytes=[int64]$measure.Sum; ErrorCount=$enumerationErrors.Count
Complete=($enumerationErrors.Count -eq 0)
}
$summary
Measure-Object Length -Sumは列挙できたファイルの論理サイズを合計する。割り当て済みサイズ、圧縮、重複除去、再解析ポイントの扱いとは一致しないことがある。出力が多い場合も最初から無理に一件へ絞らず、候補数と除外理由を残してから対象を決めます。
GiB表示と実バイトを併記
GiB表示と実バイトを併記では、Get-ChildItem -Fileで対象を限定し、合計バイトとファイル数に加えて列挙エラーを別に採取する。ディレクトリ容量の正確な集計の例中にある名前、パス、ID、時刻はサンプルなので、そのまま本番へ貼らず、直前の読み取り結果から承認値を入れます。
[pscustomobject]@{
Root=$summary.Root; Files=$summary.Files; Bytes=$summary.Bytes
GiB=[math]::Round($summary.Bytes / 1GB, 3)
ErrorCount=$summary.ErrorCount; Complete=$summary.Complete
}
if ($enumerationErrors.Count) {
$enumerationErrors | Select-Object @{n='Target';e={$_.TargetObject}},
FullyQualifiedErrorId, @{n='Message';e={$_.Exception.Message}}
Write-Warning '列挙エラーがあるため合計は下限値です。'
}
大規模ツリーを業務時間に-RecurseするとI/O負荷が上がる。ジャンクション循環とネットワーク共有にも注意する。ディレクトリ容量の正確な集計でプレビュー対応コマンドを使える場合はWhatIfを先に実行し、非対応の操作は対象一覧と引数を画面へ出して人が承認してから一度だけ実行します。
エクスプローラーとの差が出る理由
エクスプローラーとの差が出る理由では同じ対象を別経路でもう一度読みます。判定したいのは「コマンドが終了したか」ではなく、ルート、時刻、件数、合計バイト、除外条件、エラー件数が一つの記録にそろうかどうかです。
$files | Group-Object Extension | ForEach-Object {
$m = $_.Group | Measure-Object Length -Sum
[pscustomobject]@{
Extension=if ($_.Name) { $_.Name } else { '(none)' }
Files=$m.Count; Bytes=[int64]$m.Sum
}
} | Sort-Object Bytes -Descending | Select-Object -First 10
0バイトなら空フォルダーだけでなく、アクセス拒否、パス違い、フィルター、クラウドのオンライン専用状態を調べる。ディレクトリ容量の正確な集計の期待値と実測値が一致しないときは追加変更を重ねず、対象識別、権限、ポリシー、時間差の順で原因を分けます。
巨大フォルダーを段階的に絞る
大規模ツリーを業務時間に-RecurseするとI/O負荷が上がる。ジャンクション循環とネットワーク共有にも注意する。巨大フォルダーを段階的に絞るに該当したら、警告を消して継続するのではなく、どの条件で止まったかを記録します。
0バイトなら空フォルダーだけでなく、アクセス拒否、パス違い、フィルター、クラウドのオンライン専用状態を調べる。ディレクトリ容量の正確な集計ではエラー本文、FullyQualifiedErrorId、対象ID、直前に成功した段階を残すと、別担当者が安全な地点から調査できます。
定期レポートで比較可能にする
読み取りのみで復元不要。生成したレポートに個人名や機密パスを含む場合は保管場所を制限する。復旧操作にも同じ識別条件を使い、名前が似た別対象へ戻し処理を適用しません。
- ディレクトリ容量の正確な集計の変更前値と取得時刻
- 復旧対象: LiteralPathで固定したルート、ファイルのFullName、Length、最終更新時刻、取得エラーを記録する
- 復旧後の判定: ルート、時刻、件数、合計バイト、除外条件、エラー件数が一つの記録にそろう
- 再実行を止める条件: 大規模ツリーを業務時間に-RecurseするとI/O負荷が上がる。ジャンクション循環とネットワーク共有にも注意する
完了時に件数も照合する
増減比較では同じルート・除外・権限で採取し、拡張子や直下サブフォルダー別へ段階的に掘る。ディレクトリ容量の正確な集計を繰り返す場合は、正常、対象なし、要承認、失敗を異なる終了状態として記録し、前回値との比較だけで異常を決めません。
| 完了時に件数も照合するの識別軸 | LiteralPathで固定したルート、ファイルのFullName、Length、最終更新時刻、取得エラーを記録する |
| 採用する実測 | ルート、時刻、件数、合計バイト、除外条件、エラー件数が一つの記録にそろう |
| 0件時の扱い | 0バイトなら空フォルダーだけでなく、アクセス拒否、パス違い、フィルター、クラウドのオンライン専用状態を調べる |
| 保留にする兆候 | 大規模ツリーを業務時間に-RecurseするとI/O負荷が上がる。ジャンクション循環とネットワーク共有にも注意する |
ディレクトリ容量の正確な集計の実行記録には、開始前の対象候補、採用した識別値、実行したコード、終了後の実測、除外した候補と理由を同じ作業番号で残します。特に「LiteralPathで固定したルート、ファイルのFullName、Length、最終更新時刻、取得エラーを記録する」を省くと、後日の再確認で別対象の値を比較するおそれがあります。画面コピーだけでなく、日時と端末名を含む構造化した出力も保存します。
PowerShellを使用して特定のディレクトリのサイズを確認する方法を定期手順へ組み込む場合も、初回は対話的に候補を確認します。正常時は「ルート、時刻、件数、合計バイト、除外条件、エラー件数が一つの記録にそろう」、判定不能時は「0バイトなら空フォルダーだけでなく、アクセス拒否、パス違い、フィルター、クラウドのオンライン専用状態を調べる」、中止時は「大規模ツリーを業務時間に-RecurseするとI/O負荷が上がる。ジャンクション循環とネットワーク共有にも注意する」をそれぞれ別の結果として扱います。これにより、0件や例外を都合よく成功へ丸めず、次の担当者が同じ対象と条件で追試できます。
修正後コードの合格条件:SilentlyContinueは画面表示だけを抑え、ErrorVariableで欠落を必ず残します。合計は列挙できたファイルだけの論理サイズであり、ErrorCountが0のときだけ完全な列挙として扱います。
公式情報・参考資料
ディレクトリ容量の正確な集計で使うコマンド名、引数、対応環境は次のMicrosoft一次資料で確認しました。記事の確認日は2026年7月17日です。OSやモジュール更新後は、実行端末のGet-Helpと併せて再確認してください。

コメント