バッチファイルでファイル名の長さに関係なく特定のワードを別の文字列にする

1.通常のコマンドプロンプトの複数ファイルの名前変更方法と問題点
通常は変更前後の文字、文字列(文字の並びのプログラム的呼称)が同じ文字列長であれば以下の様にコマンドプロンプトで一発変更できるが文字数が異なるファイル名の変更は厄介な要素がある。
例えば、ABCDWORDEFG_001.jpg~ABCDWORDEFG_999.jpg の999個のファイル名を同じ文字列長ABCD文字変換EFG_001.jpg~ABCD文字変換EFG_999.jpgなどのファイル名に替えるにはコマンドプロンプトで
>ren ????WORD*.jpg ????文字変換*.*
もしくは
>rename ????WORD*.* ????文字変換*.*
などと入力すればよいが文字列長が異なるとコマンドプロンプトでは対応できない。
2.バッチファイルでワード単位で変更するバッチファイル
上記の様に文字列長、ファイル名の長さの異なるファイル名への変更はコマンドプロンプトではABCDWORDEFG_001~999.jpgをABCD言葉_001~999.jpgやABCD言葉EFG_001~999.jpgに変更出来ない。かと言ってアプリを買うほどの事でもなく、手入力でも100件以上になると手作業も少し煩わしい。
ちょっとコーディングが長いがバッチで対応してみた。

【注意点】
例えばJPGJPNJKLM_001.jpgで変更キーワードを「JP」にしてしまうと拡張子含め3か所にJPがあり三度繰り返す、「J」など単一アルファベットでは四回繰り返す、よってなるべく長く、「JPN」→「日本」と言う指定をして一回で済むように入力する必要がある。或はファイル名の最初の文字「JPG」を写真に変えたければ「JPGJ」と拡張子や他のところが引っかからないワードにして変更後を「写真J」の様に工夫する必要がある。
また、現在のコーディングでは拡張子部分はラベル:Err1に飛び、pauseでキー入力が必要となる。件数によるが何もしてない様に見える時間が存在することに成るがpauseを外せば拡張子部分は無視し、余計なキー入力も不要になる。
ただし、私の頭の中(Forで対象となるファイル名とヌルと言う条件から)では拡張子部分以外、Err1に飛ばない予定であるがバグ出しの難しさで断言できる程バグ出しも行っていないので注意してほしい。

現状の下記コーディングには変更後のファイル名が存在する場合のエラー処理はしていない。
どうしたいかにもよるが(Err2は自分で考えて、単純無視ならgoto :EOFでOK)
if EXIST "%new_f_name%" goto :Err2
等、Loop4のrenameの行の直前に追加が必要
多分、現状ではエラーメッセージが出る

対象ファイル:バッチファイルの存在するフォルダーのデータファイルのみ



バッチファイルコーディング===の中をコピペ(コピー&ペースト、コピー&貼り付け)してバッチファイル作成する。(作成方法は末尾の別ブログリンク参照)
===
@echo off
color a
rem *******<ChangeWRD.bat:V1R1>*******

echo *********************************************
echo * ファイル名の一部をワードを変更します *
echo *********************************************
echo.
set /p O_WRD="ファイル名で変更する古い共通ワードを入力してください?"
echo.

set /p N_WRD="ファイル名で変更したい新しい共通ワードを入力してください?"

for %%I in ("*%O_WRD%*") do call :sub_main "%O_WRD%","%N_WRD%","%%~nxI","%%~nI","%%~xI"

color b
echo.
echo *************************
echo 処理が終了しました。

pause
exit

:sub_main

set old_wrd=%~1
set new_wrd=%~2
set f_x_name=%~3
set f_name=%~4
set ext_name=%~5

rem echo %old_wrd% %new_wrd% %f_x_name% %f_name% %ext_name%
rem 対象を外す拡張子を指定する。
if /i %ext_name%==.bat goto :EOF

set new_f_name=""
set f_len=0
set n=0

:loop1
call set c=%%f_name:~%n%,1%%
set /a n=n+1
if "%c%"=="" goto :e_loop1
goto loop1

:e_loop1
set /a f_len=n-1
set o_len=0
set /a n=0

:loop2
call set c=%%old_wrd:~%n%,1%%
set /a n=n+1
if "%c%"=="" goto :e_loop2
goto loop2

:e_loop2
set /a o_len=n-1

set /a n=0
set /a n0=f_len-o_len
set m=

:loop3

call set wrd=%%f_name:~%n%,%o_len%%%

if /i "%wrd%"=="" goto :Err1

if /i "%old_wrd%"=="%wrd%" goto :loop4

set /a n=n+1
set m=%m%?
set /a n0=n0-1
if n0==0 goto :EOF

goto :loop3

:loop4

call set l_wrd=%%f_name:~-%n0%%%
set new_f_name=%m%%new_wrd%%l_wrd%%ext_name%
rename "%f_x_name%" "%new_f_name%"
echo "%f_x_name%" "%new_f_name%"

goto :EOF

:Err1

echo %old_wrd% %new_wrd% %f_x_name% %f_name% %ext_name%
color c
echo エラー発生 中止してください!
echo 拡張子にキーワードが含まれる場合は実行されません。処理を続ける場合AnyKey!
pause
goto :EOF
===




バッチの動作説明
1. 本体部分
変更前後のワードの入力とfor文によるsub_mainの呼び出し
2. sub_mainの最初
キーワードやファイル名の受け渡し、変数名の設定
3. Loop1
変更するファイルのファイル名の文字列長、文字数を取得(実際に必要な数字は文字列操作の関係で最初の文字の場合、1ではなく0と言う数字なので最後に-1している)
4. Loop2
変更前のワードの文字列長、文字数を取得
5. Loop3
ファイル名のどの部分が一致するか調べて前の部分は一文字ワイルドカード「?」を当てて、キーワード部分は入れ替えて後半部分の必要部分をそのままくっ付けて変更前rename指定ファイル名の前半部分を作成
?を幾つ繰り返すか?
6. Loop4
変更前後のrename指定ファクタを作成してrename
7. Err1
Loop3で文字列がヌル(文字列長が0に成ったらエラー処理)




動作画面

元データ:ABC_001.jpg~
画像

Fig.1 実行前データ


バッチファイルをクリックし「ABC」と「花」を入力
画像

Fig.2 バッチファイル実行時


成功したら文字を水色にしてメッセージ
画像

Fig.3 バッチファイル終了時


ABCが花に変わって 花_001.jpg~
画像

Fig.4 終了後のフォルダデータ


ABC_001のデータでBCのみ指定して花にした場合の結果
A花_001…になる。
画像

Fig.5 BCのみ花にした時のフォルダデータ結果





【参考サイト】
バッチファイルの作り方
↓↓
http://uncle-johns-room.at.webry.info/201302/article_1.html

こんな事出来ます。数行のバッチファイル集
↓↓
http://uncle-johns-room.at.webry.info/201302/article_2.html

バッチファイルでファイル名を通し番号のファイル名に変更(特定キーワードや特定データのみ変更可)
↓↓
http://uncle-johns-room.at.webry.info/201802/article_1.html




set m=
は誤記ではありません。
mに純粋なヌルを入力しますので「=」の後ろに何もつけないでください。
m=""とすると文字に""が入ってしまい不具合が出ます。
mには単一文字のワイルドカード「?」をファイル名の先頭文字から必要数繰り返します。

abcを〇×会社に変えるよう指定すると

2018abc_001


rename ????abc_001.docx ????〇×会社_001.docx
みたいなrenameに成ります。





2018/03/29 初稿につき、誤字、脱字があればご容赦、適宜変更します。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック