Windows PowerShellやPowerShell 7(旧称 Core)において、ディレクトリ内のファイルやフォルダを一覧表示する際に最も頻繁に利用されるコマンドレットが Get-ChildItem です。
日々のシステム運用や開発業務において、特定のディレクトリだけでなく、その配下にあるすべてのサブフォルダを対象にファイルを検索・操作したい場面は多々あります。
このような「再帰的」な処理を適切に行うことは、ファイル管理の自動化における基本中の基本です。
本記事では、PowerShellを使用してサブフォルダを再帰的に取得・表示する方法について、基本からパフォーマンスを意識した応用テクニックまで詳しく解説します。
2026年現在の最新の実行環境においても、これらの手法は最も効率的で信頼性の高い標準的なアプローチとして定着しています。
Get-ChildItemによる再帰的取得の基本
PowerShellでサブフォルダを含めて中身を表示するための最もシンプルな方法は、Get-ChildItem コマンドレットに -Recurse パラメータを付与することです。
-Recurseパラメータの使い方
-Recurse スイッチを使用すると、指定したパスの配下にあるすべての階層を辿り、ファイルとディレクトリをリストアップします。
# カレントディレクトリ以下のすべてのファイルとフォルダを再帰的に取得
Get-ChildItem -Recurse
このコマンドを実行すると、現在の場所から枝分かれしているすべてのサブディレクトリの内容が順番にターミナルへ表示されます。
パスを指定する場合は、以下のように記述します。
# 特定のパスを指定して再帰的に取得
Get-ChildItem -Path "C:\Work\Projects" -Recurse
出力結果の確認
実行結果には、各アイテムのモード (属性)、最終書き込み日時、ファイルサイズ (長さ)、および名前が含まれます。
再帰実行時は、どのディレクトリの内容が表示されているかを示すヘッダー行が各セクションの冒頭に挿入されます。
ディレクトリ: C:\Work\Projects
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2026/05/01 10:00 Src
-a--- 2026/05/01 10:05 1024 README.md
ディレクトリ: C:\Work\Projects\Src
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2026/05/01 11:00 5120 app.ps1
取得対象の絞り込み (ファイルとディレクトリ)
再帰的に取得する際、ファイルだけが必要な場合や、逆にフォルダ構造だけを知りたい場合があります。
これらを効率的にフィルタリングするには、専用のスイッチパラメータを使用します。
ファイルのみを取得する (-File)
サブフォルダ内のファイルのみを列挙し、ディレクトリ名自体を出力に含めたくない場合は -File パラメータを使用します。
# サブフォルダを含むすべての「ファイル」のみを取得
Get-ChildItem -Path "C:\Logs" -Recurse -File
ディレクトリのみを取得する (-Directory)
逆に、フォルダ構成を調査するためにディレクトリのみを表示したい場合は -Directory パラメータが有効です。
# サブフォルダを含むすべての「ディレクトリ」のみを取得
Get-ChildItem -Path "C:\Work" -Recurse -Directory
これにより、ファイルが表示されないため、ディレクトリツリーの構造を把握しやすくなります。
検索範囲を制御する -Depth パラメータ
非常に深い階層を持つディレクトリに対して -Recurse を実行すると、処理に時間がかかったり、不要なデータまで取得してしまったりすることがあります。
PowerShell 5.0以降では、-Depth パラメータを使用することで、再帰的に探索する階層の深さを制限できます。
指定した深さまで探索する
例えば、直下のサブフォルダ(1階層下)までのみを確認したい場合は、以下のように記述します。
# 2階層(指定したディレクトリとその直下のサブフォルダ)まで探索
Get-ChildItem -Recurse -Depth 1
-Depth 0 を指定した場合は、-Recurse を付けない状態と同じ結果になります。
大量のデータがあるネットワークドライブなどで検索を行う際は、このパラメータを活用して探索範囲を適切に制御することがパフォーマンス向上の鍵となります。
ワイルドカードとフィルタリングの活用
特定の拡張子を持つファイルだけを再帰的に探したい場合、-Filter パラメータや -Include パラメータを組み合わせて使用します。
-Filter による高速な絞り込み
-Filter パラメータは、ファイルシステムプロバイダーのレベルでフィルタリングを行うため、処理速度が非常に速いという特徴があります。
# サブフォルダから .log ファイルのみを再帰的に取得
Get-ChildItem -Path "C:\Data" -Filter "*.log" -Recurse
-Include と -Exclude の柔軟な指定
複数のパターンを指定したい場合は、-Include を使用します。
ただし、-Include を -Recurse と併用する際は、パスの指定方法に注意が必要です。
パスの末尾に * を含める必要があります。
# .txt と .csv の両方を再帰的に取得
Get-ChildItem -Path "C:\Reports\*" -Include "*.txt", "*.csv" -Recurse
また、特定のフォルダやファイルを除外したい場合には -Exclude が役立ちます。
# "temp" を含むファイルを除外して再帰的に取得
Get-ChildItem -Path "C:\Work" -Recurse -Exclude "*temp*"
パフォーマンスを最適化する技術
大規模なファイルサーバーなどで数万件、数百万件のファイルをスキャンする場合、Get-ChildItem の標準的な動作ではメモリ消費量が増大したり、処理が完了するまでに時間がかかったりすることがあります。
パイプラインでの逐次処理
取得した結果を一度変数に格納するのではなく、パイプライン | を使って1つずつ処理を渡すことで、メモリ使用量を抑えることが可能です。
# 取得しながら順次フルパスを表示する
Get-ChildItem -Path "D:\Archive" -Recurse -File | ForEach-Object {
$_.FullName
}
.NETメソッドの活用 (上級者向け)
さらに高速な処理が求められる場面では、PowerShellから直接 .NET の静的メソッドを呼び出す手法が有効です。
2026年のシステム管理においても、この手法は極限までパフォーマンスを絞り出すために多用されています。
# [System.IO.Directory]::EnumerateFiles を使用した高速な列挙
[System.IO.Directory]::EnumerateFiles("C:\Data", "*", [System.IO.SearchOption]::AllDirectories)
このメソッドは、すべてのファイル一覧をメモリに読み込んでから返すのではなく、列挙可能なコレクションを返すため、超大量のファイル群に対して極めて高いパフォーマンスを発揮します。
実践的な活用例
ここでは、実際の業務でよく使われる具体的なコード例を紹介します。
特定のサイズ以上のファイルを抽出する
サブフォルダを含めて、100MBを超える大きなファイルを探し、サイズ順に並べて表示します。
# 100MB以上のファイルを再帰的に検索してソート
Get-ChildItem -Path "C:\Users" -Recurse -File -ErrorAction SilentlyContinue |
Where-Object { $_.Length -gt 100MB } |
Sort-Object Length -Descending |
Select-Object FullName, @{Name="Size(MB)"; Expression={ [Math]::Round($_.Length / 1MB, 2) }}
-ErrorAction SilentlyContinue を追加することで、アクセス権限がないフォルダで発生するエラーを無視して処理を継続させています。
最近更新されたファイルをリストアップする
過去7日以内に更新されたファイルを再帰的に取得し、レポートを作成する例です。
# 過去7日間に更新されたファイルを抽出
$thresholdDate = (Get-Date).AddDays(-7)
Get-ChildItem -Path "C:\Projects" -Recurse -File |
Where-Object { $_.LastWriteTime -gt $thresholdDate } |
Select-Object LastWriteTime, FullName
まとめ
PowerShellの Get-ChildItem コマンドレットにおいて、-Recurse パラメータを使いこなすことは、効率的なファイル操作の根幹となります。
| パラメータ | 用途 |
|---|---|
-Recurse | サブフォルダを再帰的に探索する。 |
-File | ファイルのみを取得対象にする。 |
-Directory | ディレクトリのみを取得対象にする。 |
-Depth | 探索する階層の深さを制限する。 |
-Filter | システムレベルで高速に特定のファイルを絞り込む。 |
基本的な取得方法を理解した上で、-Depth による範囲制限や、-Filter による高速化、さらには .NETメソッド の併用などを状況に応じて使い分けることが重要です。
目的に合わせた最適なパラメータを選択することで、システムへの負荷を最小限に抑えつつ、必要な情報を迅速に抽出できるようになります。 2026年以降のITインフラ運用においても、これらのスキルは自動化の強力な武器となるでしょう。
