PowerShellを使って特定の拡張子を持つファイルを検索する方法

PowerShellで特定拡張子のファイルを探す基本はGet-ChildItemです。単一拡張子ならファイルシステムプロバイダーへ早い段階で条件を渡せる-Filter、複数拡張子や複雑な条件ならWhere-Objectを使います。再帰検索はフォルダー数、アクセス権、ネットワーク、隠し項目、再解析ポイントにより時間や結果が変わります。本記事では、読み取り専用で範囲を明確にし、結果を検証・保存する方法を解説します。

日程Fit。無料・登録不要。「いつ空いてる?」を、ひとつのリンクで。リンクを送って、○△×でかんたん日程調整。無料で日程を作る。
目次

検索範囲と拡張子を明確にする

最初に検索ルート、サブフォルダーを含むか、隠しファイル、ネットワーク共有、対象拡張子、期間、出力項目を決めます。Cドライブ全体をいきなり再帰検索すると、時間、アクセス拒否、システム領域、クラウド同期へ影響します。まずC:\Reportsなど業務フォルダー一つで試し、件数と所要時間を確認します。

拡張子は通常ドットを含む.txtとして扱いますが、ファイル名末尾、複数ドット、拡張子なし、末尾の空白など例外があります。大文字小文字の扱いはファイルシステムとPowerShell比較演算子で変わる可能性があります。「見た目が同じ」だけで判断せず、Name、Extension、FullNameを出力して確認します。

単一拡張子は-Filterで検索する

Get-ChildItem -LiteralPath "C:\Reports" -Filter "*.pdf" -File -Recurseは、指定ルート以下のPDFファイルを再帰的に列挙する基本例です。-LiteralPathは角括弧などをワイルドカードとして解釈せず、入力されたパスをそのまま扱います。-Fileによりディレクトリを除外し、結果はFileInfoオブジェクトとして返ります。

-Filterはファイルシステムプロバイダー側で適用され、Where-Objectで全項目を取得後に絞るより効率的な場合があります。プロバイダーごとにフィルター構文や対応が異なるため、ファイルシステム以外へ同じ想定を持ち込まないでください。結果がゼロなら、パス、拡張子、再帰、権限、隠し項目を順に確認します。

複数拡張子はExtensionを比較する

複数種類ならGet-ChildItem -LiteralPath "C:\Reports" -File -Recurse | Where-Object Extension -in ".docx",".xlsx",".pptx"とできます。すべてのファイルを列挙してから絞るため、巨大フォルダーでは負荷が増えます。拡張子ごとに-Filterを複数回実行する方法と、件数・所要時間を比較します。

Where-Objectのスクリプトブロックを使うならWhere-Object { $_.Extension -in $extensions }のように読みやすくします。入力値をコマンド文字列へ連結してInvoke-Expressionで実行する必要はありません。許可する拡張子を配列で検証し、ユーザー入力が検索ルートや別コマンドへ解釈されないようにします。

-Includeとワイルドカードの挙動に注意する

-IncludeはPathの内容や-Recurseとの組み合わせで期待と異なる結果になることがあります。単一拡張子は-Filter、複数はWhere-Objectという分かりやすい方法を基準にし、-Includeを使う場合は小さなテストフォルダーで確認します。Pathへ*を付ける例とLiteralPathは役割が違うため混同しません。

ワイルドカードの*は0文字以上、?は1文字などを表しますが、PowerShellとファイルシステムプロバイダーの解釈が完全に同じとは限りません。角括弧を含む実フォルダー名はLiteralPathを使います。利用者から受け取ったパターンをそのまま実行せず、検索対象が想定範囲内かを確認します。

アクセス拒否とエラーを結果ゼロに混ぜない

再帰検索ではアクセスできないフォルダーでエラーが発生することがあります。-ErrorAction SilentlyContinueだけで隠すと、検索できなかった範囲が分からず「該当ファイルなし」と誤判定します。運用スクリプトでは-ErrorVariableなどで失敗を別に記録し、成功件数と検索不能フォルダーを報告します。

管理者として実行すればすべて解決するとは限らず、共有権限、NTFS権限、暗号化、オフライン、クラウドプレースホルダーが関係します。検索目的のためにアクセス許可を広げず、所有部門へ承認を求めます。個人フォルダーや機密領域を横断する検索では、法令、社内規程、監査ログを確認します。

隠し項目・クラウド・ネットワーク共有を扱う

隠しファイルやシステム項目も必要なら-Forceを検討しますが、検索範囲と目的を明記します。-Forceは削除や変更を行うものではありませんが、通常見えない項目まで結果へ含めるため、機密情報や件数が増えます。クラウド同期のオンライン専用ファイルは、属性や取得動作がローカルファイルと異なる場合があります。

ネットワーク共有では回線とサーバーへ負荷がかかり、切断で結果が不完全になることがあります。サーバー側のインデックスや管理ツールがある場合はそちらを検討します。業務時間外に実行する、深さやフォルダーを分割する、サーバー管理者と調整するなど、検索が他ユーザーのファイル操作を妨げない設計にします。

結果を必要な列へ整えてCSV保存する

Get-ChildItem -LiteralPath "C:\Reports" -Filter "*.pdf" -File -Recurse | Select-Object FullName,Length,LastWriteTime | Export-Csv -LiteralPath "C:\Reports\pdf-files.csv" -NoTypeInformation -Encoding utf8で、フルパス、サイズ、更新時刻を保存できます。保存するCSV自体が検索対象へ含まれない拡張子と場所を選びます。

サイズはバイト単位なので、必要なら計算プロパティでMBへ変換し列名へ単位を付けます。LastWriteTimeは内容更新の手掛かりですが、コピーや同期で変わる可能性があります。作成日時だけで所有者や業務上の新旧を断定しません。CSVへ個人名を含むパスが出る場合、共有範囲と保管期限を制限します。

検索結果を検証し自動処理と分離する

既知のファイルをテストフォルダーへ置き、検索で見つかること、別拡張子が混じらないこと、アクセス拒否が報告されることを確認します。結果の先頭数件だけでなく、件数、拡張子別集計、ルート別集計を見ます。空の結果は正常なゼロ件か、パス誤りや権限失敗かを区別します。

検索結果を使って移動、圧縮、削除する場合は、一覧作成と変更処理を別スクリプト・別承認にします。まずCSVを担当者がレビューし、除外ルール、バックアップ、ロールバックを準備します。シンボリックリンクやジャンクション、同名ファイル、長いパス、開かれているファイルなどを検証せず、検索から直接変更へつなげません。

実務での確認チェックリスト

  • 検索ルート、再帰、拡張子、隠し項目、ネットワーク範囲を先に決める
  • 単一拡張子は-Filter、複数はExtension比較を基準にする
  • 実パスはLiteralPathでワイルドカード解釈を避ける
  • アクセス拒否を隠してゼロ件と誤判定しない
  • FullName、Length、LastWriteTimeなど必要列だけ保存する
  • 検索と移動・削除などの変更処理を分離する

公式情報・参考資料

この記事を書いた人

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

コメント

コメントする

目次