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

この記事について

環境Windows、UWSC、PowerShell
目的フォルダ内のファイル名から「abc_」のような先頭文字列を一括削除する
結果Get-ChildItem | Rename-Item -NewName { $_.Name -replace … } をPOWERSHELL()で実行する

つまずきポイント要約

  • ファイル名先頭の文字列一括削除は、コマンドプロンプトだとバッチファイルが必要になるのでPowerShellが楽

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

リネーム前のファイル名

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" }

関連記事

タイトルとURLをコピーしました