【UWSC】フォルダ内のファイル名を一括リネーム(一部削除)

任意のフォルダ内のファイルを一度にリネームするときの覚書。

リネーム前のファイル名
-------------------------------
abc_001.jpg
abc_002.jpg
abc_003.jpg
-------------------------------

リネーム後のファイル名
-------------------------------
001.jpg
002.jpg
003.jpg
-------------------------------

ようは_(アンダーバー)を含むそれより前の文字列を削除したい。
コマンドプロンプトだと、ファイルの先頭に文字列を付け足したり、拡張子の変更などは簡単に rename コマンドで出来る。けど、先頭の文字を一括削除は、少しスクリプトが複雑になるので、今回はパワーシェルを用いる。

//カレントディレクトリにあるファイルをリネームする場合
-------------------------------
ps = "Get-ChildItem * | Rename-Item -NewName { $_.Name -replace <#DBL>abc_<#DBL>, <#DBL><#DBL> }"

POWERSHELL(ps)
-------------------------------
やっていることは、まず Get-ChildItem でファイルを取得して、その結果を|(パイプ)で一つずつ Rename-Item に送っている。"$_.Name" はパイプで送られてきたファイル名を表す。"-replace" でファイル名の一部を置換。今回の例では「abc_」を空文字に置き換えている。

//ディレクトリのパスを指定してリネーム(CドライブのUsersディレクトリを指定)
-------------------------------
ps = "Get-ChildItem C:¥Users¥* | Rename-Item -NewName { $_.Name -replace <#DBL>abc_<#DBL>, <#DBL><#DBL> }"

POWERSHELL(ps)
-------------------------------

//コマンドプロンプトでやるとバッチファイルを作る必要がある
-------------------------------
for %%f in ( * ) do call :sub "%%f"
exit /b

:sub
set fname=%1
set fname=%fname:abc_=%
ren %1 %fname%
goto :EOF
-------------------------------
=の右側が置換後の文字列。

コマンドプロンプトの文字列置換の構文
-------------------------------
%[元の文字列]:[置き換え前の文字列]=[置き換え後の文字列]%
-------------------------------

なお、Get-ChildItem と Rename-Item はコマンドプロンプトでいえば dir と ren なので、それぞれ dir と ren がエイリアスとして使える。

もう少し細かな指定も出来る↓

//リネームする対象を.jpgファイルだけにすると
-------------------------------
ps = "Get-ChildItem *.jpg | Rename-Item -NewName { $_.Name -replace <#DBL>abc_<#DBL>, <#DBL><#DBL> }"

POWERSHELL(ps)
-------------------------------

//ファイル名が xyz から始まるファイルに対して xyz を789 に置換して、さらに拡張子を.jpg から .txt にする場合。
-------------------------------
Get-ChildItem xyz* | Rename-Item -NewName { ($_.Name -replace "xyz", "789") -replace "jpg", "txt" }
-------------------------------