Windowsのシステム管理や日々の業務において、特定の条件に合致するファイルを素早く見つけ出すスキルは欠かせません。
特に「数ヶ月以上更新されていない古いログファイル」や「ディスク容量を圧迫している巨大なファイル」を特定する作業は、運用保守の現場で頻繁に発生します。
Windows標準の検索機能も便利ですが、より詳細な条件を指定して効率的に抽出したい場合には、PowerShellの活用が最適です。
PowerShellを使用すれば、ファイルの日時やサイズをミリ単位で制御し、複雑なフィルタリングを一行のコマンドで完結させることが可能です。
本記事では、PowerShellのGet-ChildItemコマンドレットとWhere-Objectを組み合わせ、日時やサイズを条件としたファイル検索のテクニックを具体的に解説します。
Get-ChildItemによるファイル検索の基本
PowerShellでファイルやフォルダの情報を取得する際の基本となるコマンドレットがGet-ChildItemです。
このコマンドレットは、指定したパスに含まれるアイテムを一覧表示する機能を持ち、ファイル名だけでなく作成日時やサイズといった属性情報も保持しています。
基本的な構文は、Get-ChildItem -Path "パス"のように記述します。
現在のディレクトリを対象とする場合はパスを省略することも可能です。
サブディレクトリまで含めて検索したい場合は、-Recurseパラメータを追加することで、階層構造を深く掘り下げてスキャンできます。
しかし、単に一覧を表示するだけでは目的のファイルを見つけ出すのは困難です。
そこで重要になるのが、パイプライン(|)を使用して検索結果を次の処理に渡す仕組みです。
取得したオブジェクトに対してフィルタリングを行うWhere-Objectを組み合わせることで、特定の条件に合致するものだけを抽出できるようになります。
日時を指定してファイルを検索する方法
ファイル検索において最も頻繁に利用される条件の一つが、更新日時や作成日時です。
PowerShellのファイルオブジェクトには、複数の日時属性が含まれています。
代表的なものには、最後に更新された日時を示すLastWriteTime、ファイルが作成された日時を示すCreationTime、最後にアクセスされた日時を示すLastAccessTimeがあります。
これらの属性をWhere-Objectで比較することで、特定の日付範囲にあるファイルを絞り込むことができます。
特定の日付より新しいファイルを抽出する
例えば、2026年1月1日以降に更新されたファイルを検索したい場合、比較演算子を使用します。
PowerShellでは「~より大きい(以降)」を意味する演算子として-gt(Greater Than)を利用します。
# 2026年1月1日以降に更新されたファイルを検索
Get-ChildItem -Path "C:\Data" -Recurse | Where-Object { $_.LastWriteTime -gt "2026/01/01" }
このコマンドを実行すると、指定したパス内のすべての階層から、条件に一致するファイルのみが表示されます。
「〇日以内」や「〇日前」といった相対的な検索
特定の日付を直接指定するのではなく、「本日より7日以内に更新されたもの」といった相対的な指定を行いたい場面も多いでしょう。
その場合は、Get-DateコマンドレットとAddDaysメソッドを組み合わせて使用します。
過去30日間で一度も更新されていないファイルを抽出するコマンド例を見てみましょう。
# 現在から30日前より古い(更新日時が前である)ファイルを抽出
$limitDate = (Get-Date).AddDays(-30)
Get-ChildItem -Path "C:\Logs" -File | Where-Object { $_.LastWriteTime -lt $limitDate }
Directory: C:\Logs
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2025/12/15 10:00 15420 old_log_01.log
-a---- 2025/12/20 15:30 22100 system_check.txt
このように変数を活用することで、スクリプトの可読性が向上し、メンテナンスも容易になります。
ファイルサイズを指定して検索する方法
ストレージの容量不足を解消するために、サイズの大きいファイルを探し出したい状況では、Lengthプロパティを使用します。
PowerShellにおけるファイルサイズはバイト(Byte)単位で管理されていますが、数値を直接入力するのは効率的ではありません。
PowerShellの便利な特徴として、KB、MB、GBといった単位を数値の後ろに付けるだけで、自動的にバイト数に換算してくれる機能があります。
特定のサイズ以上のファイルを抽出する
例えば、100MBを超えるファイルだけをリストアップしたい場合は、以下のように記述します。
単位指定を活用することで、計算ミスを防ぎ直感的な記述が可能になります。
# 100MB以上のサイズのファイルを検索
Get-ChildItem -Path "C:\Users\Documents" -Recurse -File | Where-Object { $_.Length -gt 100MB }
-Fileパラメータを使用することで、フォルダ(ディレクトリ)を除外し、ファイルのみを対象にサイズ判定を行うことができます。
サイズの範囲を指定して検索する
特定の範囲、例えば「10MB以上50MB未満」のファイルを検索したい場合は、論理演算子-andを使用します。
# 10MB以上かつ50MB未満のファイルを抽出
Get-ChildItem -Path "D:\Work" -File | Where-Object { $_.Length -ge 10MB -and $_.Length -lt 50MB }
これにより、細かなファイル選別が容易になります。
日時とサイズを組み合わせた高度な検索
実務では「1年以上更新されておらず、かつサイズが500MB以上のファイル」といった、複数の条件を組み合わせた検索が求められます。
このような複雑な条件も、PowerShellならシンプルに記述できます。
# 1年以上更新がない、かつ1GB以上のファイルを検索してリスト化
$oldDate = (Get-Date).AddYears(-1)
Get-ChildItem -Path "E:\Backup" -Recurse -File | Where-Object {
$_.LastWriteTime -lt $oldDate -and $_.Length -gt 1GB
}
このスクリプトは、長期間放置されている巨大なバックアップファイルなどを特定するのに非常に役立ちます。
このように複数のプロパティを組み合わせることで、検索精度を大幅に高めることが可能です。
検索結果の出力と整理方法
検索結果を表示する際、デフォルトの出力項目だけでは不十分な場合があります。
また、抽出した結果を報告書として提出したり、別のツールで解析したりするためにCSV形式で保存したい場合もあります。
特定のプロパティのみを表示する
Select-Objectを使用すると、必要な項目だけを抽出して表形式で整形できます。
# ファイル名、サイズ(MB単位)、更新日時を選択して表示
Get-ChildItem -Path "C:\Data" -File | Select-Object Name, @{Name="Size(MB)";Expression={$_.Length / 1MB}}, LastWriteTime
上記のコードでは、計算式(ハッシュテーブル)を用いて、バイト単位のサイズを分かりやすいメガバイト単位に変換して表示しています。
CSVファイルへのエクスポート
大量の検索結果を保存するには、Export-Csvコマンドレットが便利です。
# 検索結果をCSVファイルに出力
Get-ChildItem -Path "C:\Logs" -Recurse | Where-Object { $_.Length -gt 10MB } | Export-Csv -Path ".\LargeFilesList.csv" -NoTypeInformation -Encoding UTF8
この一行を実行するだけで、Excel等で閲覧可能な調査レポートが完成します。
-NoTypeInformationパラメータを付与することで、CSVの1行目に型情報が出力されるのを防ぎ、データとして扱いやすくしています。
検索時の注意点とパフォーマンス向上
PowerShellでのファイル検索を行う際、特にネットワークドライブや数万個のファイルが存在するディレクトリを対象にする場合は、処理速度に注意が必要です。
Get-ChildItemは非常に便利ですが、すべてのオブジェクトをメモリに展開してからフィルタリングを行うため、対象が多すぎると実行時間が長くなる傾向があります。
パフォーマンスを改善するための一つの方法は、可能な限り最初の段階で対象を絞り込むことです。
例えば、拡張子が分かっている場合は-Filterパラメータを使用します。
# .logファイルだけを対象にすることで処理を高速化
Get-ChildItem -Path "C:\Logs" -Filter "*.log" -Recurse | Where-Object { $_.Length -gt 1MB }
-FilterはWhere-Objectよりも高速に動作するため、あらかじめ拡張子やファイル名パターンで絞り込める場合は積極的に活用しましょう。
また、システムフォルダなどを検索する際に「アクセス拒否」のエラーが発生して処理が止まってしまうことがあります。
その場合は、-ErrorAction SilentlyContinueを追加することで、エラーメッセージを非表示にして処理を続行させることができます。
# エラーを無視して検索を継続
Get-ChildItem -Path "C:\" -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.Length -gt 1GB }
これにより、アクセス権限のないフォルダでコマンドが中断される事態を避け、スキャンを完遂させることが可能です。
まとめ
PowerShellを用いたファイル検索は、単なる名前の一致だけでなく、日時やサイズといった詳細な属性を自在に操れる強力な手法です。
Get-ChildItemで情報を取得し、Where-Objectで厳密にフィルタリングするという流れをマスターすれば、日常の管理業務は劇的に効率化されます。
また、Get-Dateによる相対的な日付指定や、MBやGBといった単位指定を使いこなすことで、ミスのない正確な操作が可能になります。
抽出した結果をCSVで出力するテクニックも併せて活用し、データの整理やレポーティングに役立ててください。
まずは身近なフォルダを対象に、今回紹介したコマンドを実行してその利便性を体感してみることをおすすめします。
PowerShellを使いこなすことは、現代のシステム運用において極めて重要なスキルの一つとなるでしょう。
