大容量ファイルを見つけてCSVに保存!PowerShellで簡単にファイル管理

Windowsで大容量ファイルを洗い出すなら、PowerShellのGet-ChildItemでファイルを再帰列挙し、Lengthを基準に抽出・並べ替え、Select-Objectで見やすい列を作り、Export-Csvで記録します。削除は行わず、まず対象パス、アクセス拒否、再解析ポイント、単位、CSV文字コードを確認します。この記事では、10GB以上のファイルを例に、安全な読み取り調査と再実行可能なCSV作成、検証までを説明します。

目次

基本コマンド

次の例はD:\Data配下の通常ファイルを列挙し、10GB以上をサイズ降順にして、完全パス、サイズ、更新日時をCSVへ出します。対象と出力先を自分の環境で確認し、十分な権限がある読み取り対象だけで実行してください。

$root = 'D:\Data'
$limit = 10GB
$outDir = Join-Path ([Environment]::GetFolderPath('MyDocuments')) 'Reports'
if (-not (Test-Path -LiteralPath $outDir -PathType Container)) {
  $null = New-Item -ItemType Directory -Path $outDir
}
$out = Join-Path $outDir 'large-files.csv'

Get-ChildItem -LiteralPath $root -File -Recurse -ErrorAction SilentlyContinue |
  Where-Object { $_.Length -ge $limit } |
  Sort-Object Length -Descending |
  Select-Object FullName, Length,
    @{Name='SizeGiB';Expression={[math]::Round($_.Length / 1GB, 2)}},
    LastWriteTime |
  Export-Csv -LiteralPath $out -NoTypeInformation -Encoding utf8

Get-ChildItemはファイルとフォルダーを列挙し、FileSystemプロバイダーではLengthやLastWriteTimeを返します。-LiteralPathは角括弧やワイルドカード記号を含むパスをそのまま扱います。-Fileでファイルだけ、-Recurseで子フォルダーまで調べます。Export-CsvはオブジェクトのプロパティをCSV行へ変換するため、Format-Tableを途中に入れません。

実行前の確認

  • 検索ルートが本当に対象ドライブ・共有か
  • CSV出力先が検索ルート外で、既存ファイルを上書きしない名前か
  • 10GBなどの閾値とGB/GiBの表示を関係者と合意したか
  • アクセス拒否を無視してよいか、未調査領域を別に記録するか
  • ネットワーク共有へ高負荷をかけない時間帯か
  • ジャンクション・リンク・クラウドプレースホルダーの扱いを決めたか
  • 結果に個人名・機密パスが含まれるため保存権限を限定したか

Export-Csvは存在しない親directoryを自動作成しません。例では現在userのDocuments配下にReports directoryがなければNew-Itemで一度だけ作り、Join-Pathで三つのCSV出力先を組み立てます。実行前に$outDirがdirectoryであり、書き込み可能で、既存reportの上書きが許可されるか確認してください。

最初は-Recurseを付けずルート直下だけ、または小さなテストフォルダーで実行し、列と単位を確認します。巨大ファイルサーバー全体を対話セッションで走査すると、時間と負荷が増えます。管理者と対象共有、実行時間、キャンセル方法、監視を決め、必要ならサーバー側の管理ツールを使います。

SizeGiB列を追加する理由

Lengthはバイト数なので正確な比較と再集計に使えますが、人が読むには大きすぎます。計算プロパティでSizeGiBを追加すると、Lengthを残したまま見やすくできます。1GBはPowerShellで二進単位相当として扱われるため、ストレージ製品の十進GB表示と数値差が出ます。レポートの単位名をSizeGiBと明記し、混同を避けます。

アクセス拒否を記録する

-ErrorAction SilentlyContinueだけでは、調査できなかったフォルダーが見えません。完全性が必要なら-errorvariableへエラーを集め、別CSVへ保存します。エラー本文には内部パスが含まれるため、結果と同じくアクセスを制限します。権限不足を解決するために所有権やACLを変更せず、管理者へ未調査範囲を報告します。

$scanErrors = @()
$files = Get-ChildItem -LiteralPath $root -File -Recurse `
  -ErrorAction SilentlyContinue -ErrorVariable +scanErrors

$scanErrors |
  Select-Object Exception, CategoryInfo, TargetObject |
  Export-Csv (Join-Path $outDir 'large-files-errors.csv') `
  -NoTypeInformation -Encoding utf8

上位100件だけ確認する

閾値を決める前に最大ファイルを把握したい場合は、Length降順に並べた後でSelect-Object -First 100を使います。ただし、Sort-Objectは全対象を受け取ってから並べるため、数百万ファイルでは時間とメモリを使います。対象を部署・年・共有単位へ分け、実行時間を記録して段階的に広げます。

Get-ChildItem -LiteralPath 'D:\Data' -File -Recurse `
  -ErrorAction SilentlyContinue |
  Sort-Object Length -Descending |
  Select-Object -First 100 FullName, Length, LastWriteTime |
  Export-Csv (Join-Path $outDir 'largest-100.csv') `
  -NoTypeInformation -Encoding utf8

拡張子・所有場所で集計する

大きいファイルを見つけた後、拡張子や第一階層フォルダーで集計すると対策を決めやすくなります。ただし、拡張子だけで内容や不要性を断定しません。バックアップ、仮想ディスク、データベース、メール、動画は大きいことが正常です。所有部署、作成元、保持期間、復元要件を確認します。

ネットワーク共有とクラウド同期の注意

UNCパスを走査するとファイルサーバー、回線、セキュリティ検査へ負荷がかかります。管理者の承認を得て、ピーク時間を避け、共有単位で実行します。DFSやリンクで同じ領域へ複数経路から到達する構成では重複計上を確認します。

OneDrive Files On-Demandなどのプレースホルダーは、Lengthが論理サイズを示してもローカル占有量と異なる場合があります。列挙がダウンロードを誘発しないことを小さく試し、目的がローカル空き容量なら、アプリやWindowsのストレージ表示も併用します。

CSVを検証する

  1. Export-Csvの終了後、出力ファイルが存在し、サイズがゼロでないことを確認する。
  2. Import-Csvで読み戻し、行数と先頭・末尾の列を確認する。
  3. 数件のFullNameをエクスプローラーのプロパティと照合する。
  4. Lengthが数値として保持され、SizeGiBと計算が合うか確認する。
  5. 日本語パスが文字化けせずExcelで開けるか確認する。
  6. 検索時刻、ルート、閾値、エラー件数をレポートへ添える。

CSVをExcelで開いて保存すると、長い数値、日付、先頭ゼロ、区切りが自動変換される場合があります。原本CSVを変更せず保管し、分析用Excelは別名にします。自動処理へ渡すならImport-Csvで列名と型変換を明示します。

結果から削除へ直行しない

大容量だから不要とは限りません。仮想ディスク、データベース、監査ログ、バックアップ、設計データは削除で障害や法令違反につながります。レポートには推奨操作を自動記入せず、所有者、保持期限、別バックアップ、アプリ停止手順、復元試験を確認します。この記事のコマンドは読み取りとCSV出力だけに留めます。

再実行と切り戻し

スクリプトには検索ルート、閾値、出力先を冒頭変数として残し、実行日時とPowerShell版を記録します。出力ファイルを上書きしたくない場合は日時をファイル名へ入れます。調査はファイルを変更しないため、切り戻し対象は作成したCSVと実行負荷です。不要なレポートを処分するときも組織の記録・機密廃棄手順に従います。

公式情報・参考資料

以下は2026年7月17日に確認したMicrosoft PowerShell公式資料です。Windows PowerShell 5.1とPowerShell 7では既定エンコーディングなどが異なるため、利用版を記録してください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次