概要
PowerShellでファイル名を変更する方法を記載する。
スクリプトで使うというより、ワンライナーでやるときを想定したもの。
補足:
PowerShellのリネームの記事自体はぐぐれば結構あるのですが Get-ChildItem
で罠がある事例も掲載している人もいるみたいなので、その辺も含めた備忘録です。
環境
- OS ... Windows 10
- PowerShell ... 5.1.19041.1023
テストデータ
> New-Item -Name foo.txt -ItemType File; New-Item -Name bar.txt -ItemType File; New-Item -Name baz.txt -ItemType File
foo.txt
bar.txt
baz.txt
コマンドの例
Get-ChildItem
の丸かっこが重要です。
なお、例が横長になるのを避けたかったので、カレントディレクトリに移動する前提の例にしています。(.
も省略できるんですが、察してください。)
ファイル名に含まれるキーワードを置換する
foo を foo2 に変更する例
cd "<target-directory>"
(Get-ChildItem -File .) | Rename-Item -NewName {$_ -replace "foo", "foo2"}
ファイルの先頭にprefixを追加する
cd "<target-directory>"
(Get-ChildItem -File .) | Rename-Item -NewName {$_ -replace "^", "prefix-"}
大して変わりませんが、他には次の方法があります。
-
一度、ディレクトリの一覧を変数に入れる
cd "<target-directory>" $items = Get-ChildItem -File . $items | Rename-Item -NewName {$_ -replace "^", "prefix-"}
-
ForEach-Object を使う
cd "<target-directory>" (Get-ChildItem -File .) | ForEach-Object { Rename-Item $_ ($_.Name -replace "^", "prefix-")}
ファイルの先頭からprefixを削除する
cd "<target-directory>"
(Get-ChildItem -File .) | Rename-Item -NewName {$_ -replace "^prefix-", ""}
NG例: ファイルの先頭にprefixを追加する
Get-ChildItem
に丸かっこ付けない場合は、ファイル数が多いと prefix-prefix-prefix-...
といった名前になる。
自分のマシンだとファイル数を30から40に変えたら問題が起こった。
cd "<target-directory>"
Get-ChildItem -File . | Rename-Item -NewName { "prefix-" + $_.Name }