「社内で受け取った数百個のファイル名から、不要な文字列を一括で削除したい」「バラバラな命名規則のファイルを綺麗に整理したいけれど、手作業では何時間もかかってしまう」といったお悩みを抱えていませんか?
手動で一つずつファイル名を変更するのは大変な労力がかかりますし、ヒューマンエラーのリスクも高まります。
この記事を読むことで、PowerShellの Rename-Item コマンドレットや正規表現を活用し、大量のファイル名を効率よく一括置換・リネームする方法がわかるようになります。インフラエンジニアや情シス担当者の日々の業務効率化にぜひお役立てください。
確認した環境
本記事で紹介するスクリプトおよび手順は、以下の環境で動作を確認しています。
- OSOS [オーエス]Operating System。基本ソフトウェア: Windows 11 (64bit)
- シェル環境: PowerShell 5.1
PowerShellでファイル一括リネームが必要になる理由
業務を進める中で、複数のファイル名を一括で変更しなければならないシーンは多々あります。例えば、以下のようなケースです。
- システムから出力されたログファイルやバックアップファイルから、特定のプレフィックスやタイムスタンプを一括で削除・変更したい場合
- スクリーンショットやスキャンしたドキュメントの連番を整え、共有フォルダ内で見つけやすくしたい場合
- PowerShellの文字列処理を利用して、移行対象のファイル群に含まれるスペースや全角文字などを任意のルールに従って置換したい場合
GUIGUI [ジーユーアイ / グーイ]Graphical User Interface。グラフィカルな操作画面のファイルエクスプローラーでも複数選択してリネームすることは可能ですが、「特定の文字列だけを置換する」「複雑なパターンでマッチさせる」「連番をコントロールする」といった高度な条件付けには対応していません。PowerShellを活用すれば、これらの要件を数行のコマンドやスクリプトで自動化できます。
基本のRename-Itemコマンドレットの使い方
PowerShellでファイル名を変更するための基本となるコマンドレットが Rename-Item です。これに Get-ChildItem(ファイルの取得)を組み合わせることで、フォルダ内の複数ファイルを対象にした一括処理が可能になります。
特定の文字列を別の文字列に置換する
まずは、フォルダ内にある特定の文字列を別の文字列に置き換える基本的な手順です。ここでは、ファイル名に含まれる「old_name」という文字列をすべて「new_name」に置換する例を取り上げます。
ステップ1: 対象となるフォルダのパスを指定します。今回は C:\Work\Files を対象とします。
ステップ2: 以下のコードをファイルに保存して、実行します。
保存するファイル名: rename_basic.ps1
実行コマンド: .\rename_basic.ps1
Get-ChildItem -Path "C:\Work\Files" -File -Filter "*old_name*" | ForEach-Object { $newName = $_.Name -replace "old_name", "new_name" Rename-Item -LiteralPath $_.FullName -NewName $newName}このコマンドのポイントは以下の通りです。
Get-ChildItem: 指定したパスからファイルの一覧を取得します。-Filterで対象を絞り込むと効率的です。ForEach-Object: 取得したファイル群を一つずつループ処理します。-replace: 正規表現を使って文字列を置換するPowerShellの演算子です。単純な文字列置換だけでなく、パターンに応じた置換にも利用できます。Rename-Item: 実際にファイル名を変更します。-LiteralPathを使うことで、パスに含まれるワイルドカード文字などを特殊なパターンとして解釈せず、指定したパスをそのまま扱えます。
連番を振ってファイル名を整理する
次に、バラバラのファイル名を持つファイル群に対し、プレフィックスを指定した上で「001」「002」といった連番を振る手法です。例えば、画像やレポートファイルの名前を整理したい場合に重宝します。
以下のスクリプトを保存して実行することで、連番付きのファイル名に一括変更できます。
保存するファイル名: rename_sequence.ps1
実行コマンド: .\rename_sequence.ps1
$path = "C:\Work\Images"$files = Get-ChildItem -Path $path -File | Sort-Object CreationTime
$i = 1foreach ($file in $files) { # 3桁のゼロ埋め連番を作成 (例: 001, 002 ...) $extension = $file.Extension $newName = "Report_{0:D3}{1}" -f $i, $extension
Rename-Item -LiteralPath $file.FullName -NewName $newName $i++}Sort-Object CreationTime: 作成日時の古い順にファイルを並び替えてから連番を振っています。"{0:D3}": .NETの書式指定文字列を使い、数字を3桁のゼロ埋め(001, 002…)に変換しています。
:::note[注意]
変更後のファイル名(例: Report_001.jpg)と同名のファイルがすでにフォルダ内に存在すると、Rename-Item はエラーになります。事前に -WhatIf オプションを使って変更結果を確認し、ファイル名の競合がないことを確かめてから実行してください。
:::
正規表現を活用した高度なファイル名変更
通常の文字列置換では対応できない「日付のフォーマット変更」や「任意のパターンに一致する部分の抽出・置換」には、正規表現(Regular Expressions)が非常に強力です。
正規表現によるパターンマッチと置換実例
例えば、ファイル名に 2026-09-16_data.txt や 2026-09-17_data.txt のような日付が含まれており、これを data_20260916.txt のような形式に一括変換したいとします。
このような複雑な構造の変更には、正規表現のキャプチャグループ($1, $2 など)を利用します。
保存するファイル名: rename_regex.ps1
実行コマンド: .\rename_regex.ps1
Get-ChildItem -Path "C:\Work\Logs" -Filter "*.txt" | ForEach-Object { # YYYY-MM-DD 形式のパターンを検出し、YYYYMMDD に並び替える if ($_.Name -match '^(\d{4})-(\d{2})-(\d{2})_(.+)\.txt$') { $year = $matches[1] $month = $matches[2] $day = $matches[3] $rest = $matches[4]
$newName = "${rest}_${year}${month}${day}.txt" Rename-Item -LiteralPath $_.FullName -NewName $newName }}-match: 正規表現によるパターンマッチを行います。一致した部分は自動的に$matches変数に格納されます。$matches[1],$matches[2]…: 正規表現内の括弧()で囲んだ部分(キャプチャグループ)にマッチした文字列が順番に格納されます。
これにより、複雑な命名規則を持つ大量のファイルであっても、規則性さえ合致していればスクリプトで綺麗にリネームすることが可能です。
実行時の注意点とトラブルシューティング
ファイル名の一括変更は強力である反面、誤ったスクリプトを実行すると、意図しない名前への変更やファイル名の競合などが発生する可能性があります。Rename-Item はファイルの名前のみを変更し、内容自体は変更しませんが、一度リネームしたファイルを元に戻すのは手間がかかります。本番環境で実行する前に、必ず安全確認のステップを踏むようにしましょう。
大文字・小文字の区別に関する仕様
PowerShellの -replace や -match 演算子は、デフォルトで大文字と小文字を区別しません(case-insensitive)。例えば、-replace "old", "new" と実行すると、「OLD」や「Old」も置換の対象になります。
もし大文字・小文字を厳密に区別して置換やマッチングを行いたい場合は、それぞれ -creplace や -cmatch 演算子を使用してください。
-WhatIfオプションで実行前にシミュレーションする
PowerShellの多くのファイル操作系コマンドレットには、-WhatIf パラメータが用意されています。これをつけると、**「実際にファイル名を変更する代わりに、実行された場合にどのような変更が行われるかをコンソールに表示する」**ことができます。
保存するファイル名: rename_whatif.ps1
実行コマンド: .\rename_whatif.ps1
Get-ChildItem -Path "C:\Work\Files" -Filter "*.txt" | ForEach-Object { $newName = $_.Name -replace "old", "new" Rename-Item -LiteralPath $_.FullName -NewName $newName -WhatIf}このコマンドを実行すると、画面には「このように変更します」というメッセージだけが表示され、実際のファイルシステムは変更されません。予期せぬ置換結果になっていないか、必ず -WhatIf で事前に確認する習慣をつけましょう。
なお、-WhatIf はあくまで実行時点のファイル状態に基づくシミュレーションです。-WhatIf で確認した後、まず少数のテストファイルで実際に実行し、問題がないことを確認してから本番のファイル群へ適用することをおすすめします。
一括処理でよくあるエラーとその対処法
ファイル一括リネームの際に頻発するエラーとその原因・対処法をまとめました。
-
「指定されたファイルはすでに存在します」エラー (ItemAlreadyExists)
- 原因: 複数の異なるファイルを同じファイル名に変換しようとした場合や、すでに同名のファイルがフォルダ内に存在する場合に発生します。
- 対処法: 連番の重複がないか確認する、または変換先のファイル名がユニーク(一意)になるようにスクリプトの正規表現やカウンターを見直します。
-
「パスが見つかりません」または「アクセスが拒否されました」エラー
- 原因: 指定したパスの記述ミス、あるいは対象ファイルを使用している別のアプリケーションが、名前変更を許可しない方法でファイルを開いている場合などに発生します。
- 対処法: パスの記述に誤りがないか確認してください。ファイルがロックされている場合は、対象ファイルを使用しているアプリケーションを終了してから再実行してください。また、対象フォルダに対するアクセス権が不足している場合は、必要なアクセス権を持つアカウントで実行してください。管理者権限が必要なフォルダを操作する場合は、PowerShellを管理者として実行する方法もあります。
大規模な変更時のエラーハンドリングとログ取得
数百個のファイルを対象とする場合、途中でエラーが発生した際に「どのファイルまで処理が完了したか」を追跡できるようにしておくことが重要です。try-catch 構文を用いた簡単なログ出力の仕組みを入れておくと、情シス担当者などの業務用途において安全性がさらに高まります。
保存するファイル名: rename_with_log.ps1
実行コマンド: .\rename_with_log.ps1
$logPath = "C:\Work\rename_log.txt"
Get-ChildItem -Path "C:\Work\Files" -File -Filter "*.txt" | ForEach-Object { $oldName = $_.FullName $newName = $_.Name -replace "old", "new"
try { # エラー発生時にcatchブロックへ移行させるため -ErrorAction Stop を指定 Rename-Item -LiteralPath $oldName -NewName $newName -ErrorAction Stop Add-Content -Path $logPath -Value "[SUCCESS] $($_.Name) -> $newName" } catch { Add-Content -Path $logPath -Value "[ERROR] $($_.Name) - $($_.Exception.Message)" }}このように記述することで、成功したファイルと失敗したファイルの履歴がテキストファイルに書き出され、万が一の際にも迅速にトラブルシューティングが行えるようになります。
まとめ:PowerShellスクリプトで日々のファイル整理を自動化しよう
今回は、PowerShellを用いたファイル名の一括置換・リネーム手法について解説しました。
記事のポイントを振り返ります。
Rename-ItemとGet-ChildItemを組み合わせることで、大量のファイル名を効率よく一括変更できる-replace演算子や正規表現を使うことで、複雑なパターンマッチや文字列の並び替え・削除が自由自在に行える- 本番実行の前に
-WhatIfオプションを利用して、必ず変更結果のシミュレーションを行うことが重要である - ファイルのロックや同名ファイルの競合といったよくあるエラーには、事前の閉鎖確認や一意な命名規則の設計で対処する
インフラエンジニアや情シス担当者にとって、ファイルやログの整理は日常茶飯事のタスクです。PowerShellを使いこなすことで、手作業にかかっていた膨大な時間を削減し、手作業による変更ミスを減らして効率的にファイル整理を行えます。ぜひ、ご自身の環境でも試してみてください。
以上で本記事の解説を終わります。
よいITライフを!
人気記事
- 1
- 2
- 3
- 4
- 5
思考の整理というテーマを、実務ですぐに使える具体的な「技術」として落とし込んだ一冊です。