Windows上で多数のファイル名を手作業で変更するのは非常に面倒で時間のかかる作業です。ファイル名のパターンを統一したい場合や、特定の文字列を一括置換したいとき、PowerShellを使えばこの作業を一瞬で完了できます。本記事では、複数ファイルの一括リネームを実現するPowerShellスクリプトの基本から応用までを紹介します。
リネームの基本構文と動作の仕組み
PowerShellでファイル名を変更するには、Get-ChildItemで対象のファイル一覧を取得し、Rename-Itemで新しい名前に変更するという流れで処理します。対象となるファイルが存在するディレクトリを指定して、その中のすべてのファイルをループ処理で順番に処理していくことが基本です。
たとえば、あるフォルダ内の.txtファイルに対して、先頭に「report_」という接頭辞を追加する場合は、次のようなスクリプトで実現できます。
$folder = "C:\Files"
Get-ChildItem -Path $folder -Filter "*.txt" | ForEach-Object {
$newName = "report_" + $_.Name
Rename-Item -Path $_.FullName -NewName $newName
}
このコードでは、指定フォルダ内の.txtファイルをすべて対象とし、それぞれのファイル名の先頭に「report_」を追加しています。すでに同名のファイルが存在していると上書きエラーになる可能性があるため、必要に応じて存在チェックを追加することも検討してください。
ファイル名の一部を置換するスクリプト
特定の文字列を別の文字列に置き換える場合には、.Replace()メソッドを使って新しい名前を生成します。たとえばファイル名中の「draft」を「final」に変更する場合は、以下のように記述します。
$folder = "C:\Files"
Get-ChildItem -Path $folder -Filter "*draft*" | ForEach-Object {
$newName = $_.Name.Replace("draft", "final")
Rename-Item -Path $_.FullName -NewName $newName
}
このスクリプトは、「draft」という文字列が含まれるすべてのファイル名を検索し、「final」に置換したうえでリネームを実行します。
拡張子を変更せずに連番でリネームする方法
ファイルをすべて「image_001.jpg」「image_002.jpg」…のように番号付きで並び替えたい場合も、PowerShellで簡単に実装できます。
$folder = "C:\Images"
$files = Get-ChildItem -Path $folder -Filter "*.jpg"
$count = 1
foreach ($file in $files) {
$extension = $file.Extension
$newName = "image_{0:D3}{1}" -f $count, $extension
Rename-Item -Path $file.FullName -NewName $newName
$count++
}
このスクリプトでは、3桁のゼロ埋め連番を付けて、元の拡張子を保持したままファイル名を変更しています。写真やドキュメントなどの整理に非常に有効です。
注意点と安全な運用のポイント
一括リネームは便利である反面、間違えると多くのファイル名が意図せず変更されてしまうリスクもあります。実行前にRename-Itemの代わりにWrite-Hostで新しい名前を確認することで、事前に動作を確認することをおすすめします。
Write-Host "新しい名前: $newName"
こうしておくことで、実際に名前を変更する前にどのような変更が行われるのか確認することができ、ミスを未然に防ぐことができます。
まとめ
PowerShellを使えば、複数ファイルの名前変更を柔軟かつ高速に処理できます。単純な文字列追加から部分的な置換、連番付与まで、さまざまなニーズに対応できるため、日々のファイル整理や資料管理の効率化に大いに役立ちます。手動での煩雑な作業を自動化する手段として、ぜひ一括リネームスクリプトを活用してみてください。