💾
PowerShellを使ってのファイル名を一括でリネーム
やりたいこと
以下のようなファイル名を
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 | % {やりたい処理}
という書き方でなんとかなる場合がある。
Discussion