PowerShellを使ってのファイル名を一括でリネーム

3 min読了の目安(約3400字TECH技術記事

やりたいこと

以下のようなファイル名を

02月08日分.mp3
02月09日分.mp3
02月10日分.mp3
02月11日分.mp3
02月12日分.mp3

以下のように変更します。

001.mp3
002.mp3
003.mp3
004.mp3
005.mp3

実行例

以下のようにして一括でリネームを行いました。

Get-ChildItem *.mp3 | % -Begin {$NUM=1} {Rename-Item $_.Name $NUM.ToString("000\.mp3"); $NUM++}

解説

Get-ChildItem

Get-ChildItem でフォルダ内のファイル一覧を取得します。
今回は mp3ファイルのみをリネームしたいので、
Get-ChildItem *.mp3とします。

> Get-ChildItem *.mp3


    ディレクトリ: C:\data


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2021/02/21     15:58        1000000 02月08日分.mp3
-a----        2021/02/21     15:58        1000000 02月09日分.mp3
-a----        2021/02/21     15:58        1000000 02月10日分.mp3
-a----        2021/02/21     15:58        1000000 02月11日分.mp3
-a----        2021/02/21     15:59        1000000 02月12日分.mp3

ForEach-Object

Get-ChildItemで取得したファイル一覧をForEach-Object に渡します。

ForEach-Objectのエイリアスは %となっているので、
最初に書いたワンライナーのコマンドでは%としています。

ForEach-Objectの書式

ForEach-Objectは以下のような書き方をします。

ForEach-Object -Begin {最初のみに行う処理(省略可)} {繰り返し行う処理}

Begin

ここでは-Begin でリネーム後のファイル名で使用する連番の番号を保持する変数の初期化を行います。変数は $から始まる名称になります。

% -Begin {$NUM=1}

もしくは

ForEach-Object -Begin {$NUM=1}

です。

Beginのあと

-Begin の後は以下のように書きました。

{Rename-Item $_.Name $NUM.ToString("000\.mp3"); $NUM++}

Rename-Item

Rename-Item でファイルのリネームを行います。

{Rename-Item $_.Name $NUM.ToString("000\.mp3"); $NUM++}

ここで、 $_.Name となっていますがこれは最初の
Get-ChildItem *.mp3で取得したNameが入ります。

以下のような例がわかりやすいでしょうか。

> Get-ChildItem *.mp3


    ディレクトリ: C:\data


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2021/02/21     15:58        1000000 02月08日分.mp3
-a----        2021/02/21     15:58        1000000 02月09日分.mp3
-a----        2021/02/21     15:58        1000000 02月10日分.mp3
-a----        2021/02/21     15:58        1000000 02月11日分.mp3
-a----        2021/02/21     15:59        1000000 02月12日分.mp3

# 上記の Nameの列のみを表示
> Get-ChildItem *.mp3 | % {$_.Name}
02月08日分.mp3
02月09日分.mp3
02月10日分.mp3
02月11日分.mp3
02月12日分.mp3

ToString

以下の例ではToStringを使用して、
変数 $NUMに入っている値を3桁表示、最後に.mp3を付けた文字列にしています。

{Rename-Item $_.Name $NUM.ToString("000\.mp3"); $NUM++}

簡単な例で示すと以下のようになります。

> 1,2,3,4,5 | % {$_.ToString("000\.mp3")}
001.mp3
002.mp3
003.mp3
004.mp3
005.mp3

変数のインクリメント

$NUM++で変数$NUMの値を1づつ増やします。

{Rename-Item $_.Name $NUM.ToString("000\.mp3"); $NUM++}

まとめ

ファイルに対して一括で何かをしたいときは

Get-ChildItem | % {やりたい処理}

という書き方でなんとかなる場合がある。