Windowsでファイル名をまとめて変えるなら、画面で結果を見ながら進められるPowerToysのPowerRenameか、追加のソフトが要らないPowerShellのRename-Itemを使います。
どちらも、文字の置換・先頭や末尾への追加・連番の付け直しができます。
この記事のPowerShellのコマンドは、2026年10月18日に、Windows 11のWindows PowerShell 5.1(5.1.26100)で、テスト用のフォルダーに作ったファイルに対して実行して結果を確かめました。
PowerRenameは画面を操作して確かめておらず、Microsoft公式のドキュメントの記載をもとに書いています。
方法の選び方
| 方法 | 向いている場面 | 元に戻す |
|---|---|---|
| PowerRename(PowerToys) | 変更後の名前を一覧で見ながら決めたい | エクスプローラーの元に戻す(Ctrl+Z)で最後の変更を戻せる(公式の説明) |
| PowerShell(Rename-Item) | ソフトを入れずに済ませたい、同じ作業を繰り返す | 戻す機能はない。変更前の名前を記録しておく |
| バッチファイル | 決まった変換をダブルクリックで繰り返す | 作り方による |
バッチファイルで置換する方法は、フォルダ内のファイル名を置換するバッチファイルと先頭の連番をつけ直すバッチファイルにまとめています。
始める前に確かめること
- 元に戻せるように、対象のフォルダーごとコピーを取っておく
- 拡張子を表示しておく(変える範囲を見誤らないため)
- 対象のフォルダーに、変えたくないファイルが混ざっていないか
拡張子の表示のしかたは、Windows 11で拡張子を表示する方法で説明しています。
ファイル名に使えない文字と名前
Microsoftのドキュメント「ファイル、パス、名前空間の名前付け」では、次の文字は予約されていてファイル名に使えないとされています。
< > : " / \ | ? *CON・PRN・AUX・NULや、COM1〜COM9・LPT1〜LPT9のような名前も使わないよう書かれています。
NUL.txtのように拡張子を付けても、NULと同じ扱いになります。
また、ファイル名の最後をスペースやピリオドにしないよう書かれています。
置換の結果でこうした名前にならないかも、事前に見ておきます。
PowerRenameで変える
PowerRenameは、MicrosoftのPowerToysに入っている一括の名前変更ツールです。
Microsoftのドキュメントによると、エクスプローラーでファイルを選んで右クリックし、Rename with PowerRenameを選ぶと画面が開きます。
このメニューは、PowerToysでPowerRenameが有効になっている場合にだけ表示されます。
| 項目 | 公式ドキュメントの説明 |
|---|---|
| 検索対象・置き換える | 探す文字と置き換える文字を入れる。結果はプレビューに出る |
| 正規表現を使用する | 探す文字を正規表現として扱う |
| すべての出現箇所を一致させる | オフだと、最初に見つかった1か所だけを置き換える |
| 大文字と小文字を区別する | 既定では区別しない |
| 適用先 | ファイル名だけ、または拡張子だけを変える |
| ファイル・フォルダー・サブフォルダーを含める | 外すと、その種類を対象から除く |
| テキストの書式設定 | すべて小文字・すべて大文字などに変える |
| 項目の列挙 | 置き換える文字に連番の書式を入れられる |
連番は、置き換える文字の中に次のような書式で入れます。
${start=1} 1から数え始める
${padding=3} 3けたになるよう先頭を0で埋める
${increment=2} 2ずつ増やす公式ドキュメントでは、何も指定しない書式は、最初のファイルを0として数えると説明されています。
ファイルの作成日時を名前に入れる書式もあります。
設定例とプレビューの見方は、PowerRenameの使い方に詳しく書いています。
PowerShellで変える
PowerShellでは、Get-ChildItemでファイルの一覧を取り、Rename-Itemに渡して名前を変えます。
まずPowerShellを開き、対象のフォルダーへ移動します。
Set-Location 'C:\Users\ユーザー名\Pictures\作業用'以降のコマンドは、このフォルダーの中のファイルだけを対象にします。
Get-ChildItemの -File を付けると、フォルダーは対象から外れます(テストでも、フォルダーの名前は変わりませんでした)。
最初に -WhatIf で確かめる
Rename-Itemの公式ドキュメントでは、-WhatIfを付けると、実行した場合の動きを表示するだけで、実際には実行しないと説明されています。
Get-ChildItem -File | Rename-Item -NewName { $_.Name -replace 'IMG_','photo_' } -WhatIf実行すると、ファイルごとに次のような行が出て、ファイル名は変わりませんでした(パスは省略しています)。
WhatIf: 対象 "項目: ...\IMG_0001.jpg 変更先: ...\photo_0001.jpg" に対して操作 "ファイル名の変更" を実行しています。表示を見て問題がなければ、-WhatIf を外して実行します。
文字を置き換える
Get-ChildItem -File | Rename-Item -NewName { $_.Name -replace 'IMG_','photo_' }IMG_0001.JPGがphoto_0001.JPGに、img_0002.jpgがphoto_0002.jpgに変わりました。
公式ドキュメントにあるとおり、-replaceは大文字と小文字を区別しないためです。
大文字と小文字を区別して、書いた文字どおりに置き換えたいときは、.Replace()を使います。
Get-ChildItem -File | Rename-Item -NewName { $_.Name.Replace('IMG_','photo_') }こちらでは、IMG_0001.JPGだけが変わり、img_0002.jpgはそのまま残りました。
-replaceのピリオドに注意する
-replaceの1つ目の値は正規表現として扱われるため、ピリオドは「任意の1文字」の意味になります。
公式ドキュメントの例と同じ書き方で、拡張子の.txtを.logに変えるコマンドを試しました。
Get-ChildItem -File | Rename-Item -NewName { $_.Name -replace '.txt','.log' }| 元の名前 | 結果 |
|---|---|
| mytxt.txt | m.log.log |
| a.txt.bak | a.log.bak |
| notes_txt.md | notes.log.md |
名前の途中にあるtxtの文字まで置き換わりました。
末尾の拡張子だけを変えるなら、ピリオドの前に \ を付け、最後に $ を付けて「末尾の.txt」に限定します。
Get-ChildItem -File | Rename-Item -NewName { $_.Name -replace '\.txt$','.log' }この書き方では、mytxt.txtだけがmytxt.logになり、ほかの2つは変わりませんでした。
先頭や末尾に文字を付ける
先頭に付けるときは、文字と元の名前をつなげます。
Get-ChildItem -File | Rename-Item -NewName { '2026_' + $_.Name }拡張子の前に付けるときは、拡張子を除いた名前(BaseName)と拡張子(Extension)に分けてつなぎます。
Get-ChildItem -File | Rename-Item -NewName { $_.BaseName + '_v2' + $_.Extension }report.docxがreport_v2.docxに、data.csvがdata_v2.csvになりました。
連番を付ける
JPEGのファイルを並べ替えてから、photo_001.jpgのような3けたの連番を付ける例です。
$i = 1
Get-ChildItem -File -Filter *.jpg | Sort-Object LastWriteTime, Name | ForEach-Object {
$new = 'photo_{0:D3}{1}' -f $i, $_.Extension.ToLower()
Rename-Item -LiteralPath $_.FullName -NewName $new
$i++
}{0:D3}は、数を3けたになるよう先頭を0で埋める書式です。
DSC_8812.jpg・DSC_8813.jpg・DSC_8820.JPGの3つが、photo_001.jpgからphoto_003.jpgになり、同じフォルダーのreadme.txtは変わりませんでした。
-Filter *.jpg で、拡張子が大文字の.JPGも対象に入りました。
実行する前に、Rename-Itemの行の最後に -WhatIf を付けて、順番と名前を確かめてください。
並び順に注意する
名前で並べ替える Sort-Object Name は、文字として比べるため、scan1.jpg・scan10.jpg・scan2.jpgの順になりました。
名前の中の数字の順に並べたいときは、数字だけを取り出して数として並べ替えます。
Get-ChildItem -File | Sort-Object { [int]($_.BaseName -replace '\D','') }こちらでは、scan1.jpg・scan2.jpg・scan10.jpgの順になりました。
この書き方は、名前の中の数字を全部つなげて1つの数として扱うので、数字が2か所ある名前には向きません。
拡張子の扱い
上の例のように、BaseNameとExtensionに分けて組み立てると、拡張子を残したまま名前だけを変えられます。
拡張子の大文字を小文字にそろえるだけなら、次のようにします。
Get-ChildItem -File | Rename-Item -NewName { $_.BaseName + $_.Extension.ToLower() }a.JPGとb.Jpgが、a.jpgとb.jpgになりました。
Rename-Itemの公式ドキュメントでは、名前を変えても中身には影響しないと説明されています。
そのため、拡張子を.pngから.jpgに書き換えても、画像の形式は変わりません。
形式を変えたい場合は、変換のできるソフトで保存し直します。
うまくいかないとき
同じ名前のファイルがすでにある
Rename-Itemの公式ドキュメントでは、Rename-Itemで既存の項目を置き換えることはできないとされています。
テストでa.txtをb.txt(すでにある名前)に変えようとすると、次のエラーが出て、どちらのファイルもそのまま残りました。
Cannot create a file when that file already exists.連番を付け直すときは、新しい名前が今ある名前と重ならないよう、別の接頭辞にするなどしてから実行します。
名前に角かっこ[ ]が入っている
photo[1].jpgのように名前に半角の角かっこがあるファイルを -Path で指定すると、次のエラーになりました。
'photo[1].jpg' の項目は存在しないため、名前を変更できません。公式ドキュメントによると、-LiteralPath に書いた値は入力したとおりに使われ、ワイルドカードとして解釈される文字がありません。
Rename-Item -LiteralPath 'photo[1].jpg' -NewName 'p1.jpg'このように指定すると、同じファイルの名前を変えられました。
Get-ChildItemからそのまま渡す書き方では、角かっこがあっても名前を変えられました。
日本語を含むスクリプトがエラーになる
コマンドを.ps1のファイルに保存して実行する場合、日本語を含むスクリプトをBOMなしのUTF-8で保存したところ、Windows PowerShell 5.1では文字が化けて構文のエラーになりました。
PowerShellの公式ドキュメント「about_Character_Encoding」では、ASCII以外の文字を使うスクリプトはBOM付きのUTF-8で保存するよう書かれています。
BOMがないと、Windows PowerShellはスクリプトを従来のANSIのコードページで書かれたものと解釈するためです。
BOM付きのUTF-8で保存し直すと、同じスクリプトで日本語のファイル名を置き換えられました。
PowerShellで元に戻せるようにする
PowerShellで変えた名前を戻す機能はないため、変更前と変更後の名前をCSVに残しておくと、そこから戻せます。
(Get-ChildItem -File) | ForEach-Object {
$new = 'new_' + $_.Name
[pscustomobject]@{ Old = $_.Name; New = $new }
Rename-Item -LiteralPath $_.FullName -NewName $new
} | Export-Csv -LiteralPath ..\rename-log.csv -NoTypeInformation -Encoding UTF8記録は、対象のフォルダーの1つ上に rename-log.csv として保存されます。
戻すときは、同じフォルダーで次を実行します。
Import-Csv -LiteralPath ..\rename-log.csv | ForEach-Object { Rename-Item -LiteralPath $_.New -NewName $_.Old }テストでは、x1.txt・x2.txtをnew_x1.txt・new_x2.txtに変え、このCSVから元の名前に戻せました。
確かめていないこと
- PowerRenameの画面での操作(公式ドキュメントの説明のみ)
- エクスプローラーで複数のファイルを選んで名前を変える方法(Microsoftの公式ヘルプで手順の説明を見つけられず、画面の操作もしていない)
- PowerShell 7での動き(この記事のコマンドはWindows PowerShell 5.1で実行した)
- OneDriveなどの同期フォルダーや、ネットワーク上のフォルダーでの動き
- .ps1ファイルを実行するときの実行ポリシーの設定(テストでは実行ポリシーを一時的に指定して実行した)
参照した資料は、Microsoft LearnのRename-Item、PowerRename 用の Windows ユーティリティ、ファイル、パス、名前空間の名前付け、about_Character_Encodingです。
