バッチファイルでファイル名を通し番号のファイル名に変更(特定キーワードや特定データのみ変更可)

バッチファイルを使えば、フォルダー中の特定のデータ(拡張子)のみ変更したり、ファイル名に特定のワードのあるファイルのみ変更したりコーディング次第です。
以下のバッチファイルを作成して対象フォルダーにいれてクリックする。
下記ではバッチファイル(.bat)以外フォルダにある全てのファイルデータが対象になります。
傘下フォルダ内データ(子フォルダ、孫フォルダーのデータ)は対象外
特定のファイルを処理したい場合、rem文のremを外してアレンジしてください。
参考になりそうなコーディングはrem化してあります。

基本動作はWindows10で確認

・現状では上限999件(又は9999件)のファイル処理が可能ですがもっと対象にする場合、コーディングを工夫してください。
・デバッグはHDD(D:)などでテスト用のフォルダを作りデバッグ用ダミーデータをコピーして行うなど充分に行ってください。
・出来ればデータをHDD(D:)にコピーして一度実行し、そのデータをオリジナルデータにする等、バグや入力ミスによるデータがごちゃごちゃになる事の防止を図ってください。
・運用に関し一切の責任は持ちません。
・ファイル名が重なった場合の処理は考慮していません。しかしコマンドプロンプトでメッセージが出るようですがその辺はご自分で確認してください。(多少のエラー処理は追加しましたV4RH以降)
・傘下フォルダの映像データ、隠しファイル等対象外です。
・動作はOS、Windows10で確認してあります。
・明らかに同じファイル名などのデバッグは不十分です。違うファイル名を使う等、ご注意ください。
・処理後、バッチファイルはそのフォルダーから削除してください


拡張子の指定はサンプル的に画像データファイルを対象にコーディングしましたが目的の拡張子に変更してください。
コピペ(コピー&貼り付け)できます。===の間をコピペしてください!
(===行は含まず)
Windowsのメモ帳に「FileRename.bat」など名前は任意ですが拡張子「.bat」まで付けて文字コード「ANSI」で保存しクリックすればバッチ(bat)ファイルが存在するフォルダのファイルをリネーム(名前変更)します。
上手くいけば歯車アイコンに成ります。
その後、目的に合わせて修正してください。

【サンプルバッチの種類】
⓪ベースのバッチファイル(修正用)…現状は①と同機能
①フォルダー内全データファイル
②フォルダー内特定データ(拡張子)
③フォルダー内ファイルに使われている共通キーワードファイルのみ
④フォルダー内全データファイル・4桁対応(修正用)…現状は①と同機能4桁バージョン
対象はバッチファイルのあるフォルダーのデータのみ

ソースがごっちゃにならない様、バッチ実行時
・3文字バージョン:文字色青
・4文字バージョン:文字色緑
にしてあります。

変更する場合のコーディング注意
以下の
set basefname=%~1
set tgfname=%~2
set expfname=%~3
の数字の1,2,3の後に絶対スペース等付加してはいけません。文字列末尾にスペースが加わり誤動作します。




⓪ベースのバッチファイル(修正用)
==<FileRename.bat>==
@echo off
COLOR B
rem *******<FileRename.bat:V5RH2>*******
rem ファイル名+番号3桁

set n=0

echo ファイル名をベースのファイル名と三ケタの通し番号に変更します。
echo -や_を付加する場合は変更するベースのファイル名入力に含めてください。

set /p BASE_F_NAME="変更後のベースのファイル名を入力してください?"

rem ******************
rem 以下の****の間のfor/set文のremを目的に応じて付加及び外してください。
rem 【説明】のremは外さないでください。
rem ******************
echo.

rem 【説明】全てのファイルを対象にする場合 (*) batファイルも対象になりますがSUBで除いています
for %%I in ("*") do call :sub "%BASE_F_NAME%","%%~nxI","%%~xI"

rem 【説明】("*.jp*")=jpgとjpegファイルのみ
rem for %%I in ("*.jp*") do call :sub "%BASE_F_NAME%","%%~nxI","%%~xI"

rem 【説明】("*.bmp")=bmpファイルのみ
rem for %%I in ("*.bmp") do call :sub "%BASE_F_NAME%","%%~nxI","%%~xI"

rem 【説明】特定の文字列の付くファイルのみ変更します
rem echo 一文字や拡張子に含まれるワードは避けてください。例:JP(JPGやJPEGも対象となる)
rem set /p F_NAME="特定のワードのつくファイルのみ変更します。ファイル名に共通するワード?"
rem for %%I in ("*%F_NAME%*") do call :sub "%BASE_F_NAME%","%%~nxI","%%~xI"
rem ******************

rem 隠し属性を元に戻す
attrib "%BASE_F_NAME%*.*" -h

echo 処理が終了しました。
pause
exit

:sub

set basefname=%~1
set tgfname=%~2
set expfname=%~3

rem 対象を外す拡張子を指定する。(以下はこのバッチファイルを除外)
if /i %expfname%==.bat goto :EOF

rem 同じファイルを二度rename回避(隠し属性にしない場合必須)
rem 数字001~999の3文字+「.」+拡張子3文字の文字を除いたファイル名が一致すればスキップ
if /i "%tgfname:~0,-7%"=="%basefname%" goto :EOF
rem 数字001~999の3文字+「.」+拡張子4文字の文字を除いたファイル名が一致すればスキップ
if /i "%tgfname:~0,-8%"=="%basefname%" goto :EOF

set fname1=%tgfname%
set fname2=""
:LOOP1
set /a n=n+1

if %n% GEQ 1000 goto :ERR1

if %n% LSS 1000 set fname2=%basefname%%n%%expfname%
if %n% LSS 100 set fname2=%basefname%0%n%%expfname%
if %n% LSS 10 set fname2=%basefname%00%n%%expfname%

if EXIST "%fname2%" goto :LOOP1
rename "%fname1%" "%fname2%"
IF %ERRORLEVEL% EQU 1 goto :ERR2

rem 一旦、隠しファイルにしてforの対象から外し二度renameの対象になるのを防ぐ
attrib "%fname2%" +h

goto :EOF

:ERR1

rem 隠し属性を元に戻す
attrib "%BASE_F_NAME%*.*" -h

echo 対象ファイルが1000件を超えています。
pause
goto :EOF

:ERR2

rem 隠し属性を元に戻す
attrib "%BASE_F_NAME%*.*" -h

echo エラーレベル:%ERRORLEVEL% 重複ファイルあり:%fname1% → %fname2%、又はエラー
echo ファイル等確認の上、中止してください!
pause
goto :EOF
===




①フォルダー内全データ
==<FileRename.bat>==
@echo off
COLOR B
rem *******<FileRename.bat:V5RH2 ベース>*******
rem ファイル名+番号3桁

set n=0

echo ファイル名をベースのファイル名と三ケタの通し番号に変更します。
echo -や_を付加する場合は変更するベースのファイル名入力に含めてください。
echo.

set /p BASE_F_NAME="変更後のベースのファイル名を入力してください?"

echo.

rem 【説明】全てのファイルを対象にする場合 (*) batファイルも対象になりますがSUBで除いています
for %%I in ("*") do call :sub "%BASE_F_NAME%","%%~nxI","%%~xI"

rem 隠し属性を元に戻す
attrib "%BASE_F_NAME%*.*" -h

echo 処理が終了しました。
pause
exit

:sub

set basefname=%~1
set tgfname=%~2
set expfname=%~3

rem 対象を外す拡張子を指定する。
if /i %expfname%==.bat goto :EOF

rem 同じファイルを二度rename回避(隠し属性にしない場合必須)
rem 数字001~999の3文字+「.」+拡張子3文字の文字を除いたファイル名が一致すればスキップ
if /i "%tgfname:~0,-7%"=="%basefname%" goto :EOF
rem 数字001~999の3文字+「.」+拡張子4文字の文字を除いたファイル名が一致すればスキップ
if /i "%tgfname:~0,-8%"=="%basefname%" goto :EOF

set fname1=%tgfname%
set fname2=""
:LOOP1
set /a n=n+1

if %n% GEQ 1000 goto :ERR1

if %n% LSS 1000 set fname2=%basefname%%n%%expfname%
if %n% LSS 100 set fname2=%basefname%0%n%%expfname%
if %n% LSS 10 set fname2=%basefname%00%n%%expfname%

if EXIST "%fname2%" goto :LOOP1
rename "%fname1%" "%fname2%"
IF %ERRORLEVEL% EQU 1 goto :ERR2

rem 一旦、隠しファイルにしてforの対象から外し二度renameの対象になるのを防ぐ
attrib "%fname2%" +h

goto :EOF

:ERR1

rem 隠し属性を元に戻す
attrib "%BASE_F_NAME%*.*" -h

echo 対象ファイルが1000件を超えています。
pause
goto :EOF

:ERR2

rem 隠し属性を元に戻す
attrib "%BASE_F_NAME%*.*" -h

echo エラーレベル:%ERRORLEVEL% 重複ファイルあり:%fname1% → %fname2%、又はエラー
echo ファイル等確認の上、中止してください!
pause
goto :EOF
===




②フォルダー内特定データ
==<FileRename.bat>==
@echo off
COLOR B
rem *******<FileRename.bat:V5RH2 ベース>*******
rem ファイル名+番号3桁

set n=0

echo ファイル名をベースのファイル名と三ケタの通し番号に変更します。
echo -や_を付加する場合は変更するベースのファイル名入力に含めてください。
echo.

set /p BASE_F_NAME="変更後のベースのファイル名を入力してください?"

echo.

rem 入力するかバッチファイル内でデータを規定する。現状は入力
set /p EXP_NAME="特定データ拡張子を入力してください(ワイルドカード可)?"
rem set EXP_NAME=jp*
rem set EXP_NAME=bmp

for %%I in ("*.%EXP_NAME%") do call :sub "%BASE_F_NAME%","%%~nxI","%%~xI"

rem 隠し属性を元に戻す
attrib "%BASE_F_NAME%*.*" -h

echo 処理が終了しました。
pause
exit

:sub

set basefname=%~1
set tgfname=%~2
set expfname=%~3

rem 対象を外す拡張子を指定する。
if /i %expfname%==.bat goto :EOF

rem 同じファイルを二度rename回避(隠し属性にしない場合必須)
rem 数字001~999の3文字+「.」+拡張子3文字の文字を除いたファイル名が一致すればスキップ
if /i "%tgfname:~0,-7%"=="%basefname%" goto :EOF
rem 数字001~999の3文字+「.」+拡張子4文字の文字を除いたファイル名が一致すればスキップ
if /i "%tgfname:~0,-8%"=="%basefname%" goto :EOF

set fname1=%tgfname%
set fname2=""
:LOOP1
set /a n=n+1

if %n% GEQ 1000 goto :ERR1

if %n% LSS 1000 set fname2=%basefname%%n%%expfname%
if %n% LSS 100 set fname2=%basefname%0%n%%expfname%
if %n% LSS 10 set fname2=%basefname%00%n%%expfname%

if EXIST "%fname2%" goto :LOOP1
rename "%fname1%" "%fname2%"
IF %ERRORLEVEL% EQU 1 goto :ERR2

rem 一旦、隠しファイルにしてforの対象から外し二度renameの対象になるのを防ぐ
attrib "%fname2%" +h

goto :EOF

:ERR1

rem 隠し属性を元に戻す
attrib "%BASE_F_NAME%*.*" -h

echo 対象ファイルが1000件を超えています。
pause
goto :EOF

:ERR2

rem 隠し属性を元に戻す
attrib "%BASE_F_NAME%*.*" -h

echo エラーレベル:%ERRORLEVEL% 重複ファイルあり:%fname1% → %fname2%、又はエラー
echo ファイル等確認の上、中止してください!
pause
goto :EOF
===




③フォルダー内ファイルに使われている共通キーワードファイルのみ
==<FileRename.bat>==
@echo off
COLOR B
rem *******<FileRename.bat:V5RH2 ベース>*******
rem ファイル名+番号3桁

set n=0

echo ファイル名をベースのファイル名と三ケタの通し番号に変更します。
echo -や_を付加する場合は変更するベースのファイル名入力に含めてください。
echo.
set /p BASE_F_NAME="変更後のベースのファイル名を入力してください?"

echo.

rem 【説明】特定の文字列の付くファイルのみ変更します
echo 一文字や拡張子に含まれるワードは避けてください。例:JP(JPGやJPEGも対象となる)
set /p F_NAME="特定のワードのつくファイルのみ変更します。ファイル名に共通するワード?"
for %%I in ("*%F_NAME%*") do call :sub "%BASE_F_NAME%","%%~nxI","%%~xI"

rem 隠し属性を元に戻す
attrib "%BASE_F_NAME%*.*" -h

echo 処理が終了しました。
pause
exit

:sub

set basefname=%~1
set tgfname=%~2
set expfname=%~3

rem 対象を外す拡張子を指定する。
if /i %expfname%==.bat goto :EOF

rem 同じファイルを二度rename回避(隠し属性にしない場合必須)
rem 数字001~999の3文字+「.」+拡張子3文字の文字を除いたファイル名が一致すればスキップ
if /i "%tgfname:~0,-7%"=="%basefname%" goto :EOF
rem 数字001~999の3文字+「.」+拡張子4文字の文字を除いたファイル名が一致すればスキップ
if /i "%tgfname:~0,-8%"=="%basefname%" goto :EOF

set fname1=%tgfname%
set fname2=""
:LOOP1
set /a n=n+1

if %n% GEQ 1000 goto :ERR1

if %n% LSS 1000 set fname2=%basefname%%n%%expfname%
if %n% LSS 100 set fname2=%basefname%0%n%%expfname%
if %n% LSS 10 set fname2=%basefname%00%n%%expfname%

if EXIST "%fname2%" goto :LOOP1
rename "%fname1%" "%fname2%"
IF %ERRORLEVEL% EQU 1 goto :ERR2

rem 一旦、隠しファイルにしてforの対象から外し二度renameの対象になるのを防ぐ
attrib "%fname2%" +h

goto :EOF

:ERR1

rem 隠し属性を元に戻す
attrib "%BASE_F_NAME%*.*" -h

echo 対象ファイルが1000件を超えています。
pause
goto :EOF

:ERR2

rem 隠し属性を元に戻す
attrib "%BASE_F_NAME%*.*" -h

echo エラーレベル:%ERRORLEVEL% 重複ファイルあり:%fname1% → %fname2%、又はエラー
echo ファイル等確認の上、中止してください!
pause
goto :EOF
===




④フォルダー内全データファイル・4桁対応(修正用)
==<FileRename.bat>==
@echo off
COLOR A
rem *******<FileRename.bat:V5x2RH2>*******
rem ファイル名+番号4桁


set n=0

echo ファイル名をベースのファイル名と四ケタの通し番号に変更します。
echo -や_を付加する場合は変更するベースのファイル名入力に含めてください。

set /p BASE_F_NAME="変更後のベースのファイル名を入力してください?"

rem ******************
rem 以下の****の間のfor/set文のremを目的に応じて付加及び外してください。
rem 【説明】のremは外さないでください。
rem ******************
echo.

rem 【説明】全てのファイルを対象にする場合 (*) batファイルも対象になりますがSUBで除いています
for %%I in ("*") do call :sub "%BASE_F_NAME%","%%~nxI","%%~xI"

rem 【説明】("*.jp*")=jpgとjpegファイルのみ
rem for %%I in ("*.jp*") do call :sub "%BASE_F_NAME%","%%~nxI","%%~xI"

rem 【説明】("*.bmp")=bmpファイルのみ
rem for %%I in ("*.bmp") do call :sub "%BASE_F_NAME%","%%~nxI","%%~xI"

rem 【説明】特定の文字列の付くファイルのみ変更します
rem echo 一文字や拡張子に含まれるワードは避けてください。例:JP(JPGやJPEGも対象となる)
rem set /p F_NAME="特定のワードのつくファイルのみ変更します。ファイル名に共通するワード?"
rem for %%I in ("*%F_NAME%*") do call :sub "%BASE_F_NAME%","%%~nxI","%%~xI"
rem ******************

rem 隠し属性を元に戻す
attrib "%BASE_F_NAME%*.*" -h

echo 処理が終了しました。
pause
exit

:sub

rem 以下の^setの^%^~<数字>の後に絶対スペース等付加してはいけません。
set basefname=%~1
set tgfname=%~2
set expfname=%~3

rem 対象を外す拡張子を指定する。(以下はこのバッチファイルを除外)
if /i %expfname%==.bat goto :EOF

rem 同じファイルを二度rename回避(隠し属性にしない場合必須)
rem 数字0001~9999の4文字+「.」+拡張子3文字の文字を除いたファイル名が一致すればスキップ
if /i "%tgfname:~0,-8%"=="%basefname%" goto :EOF
rem 数字0001~9999の4文字+「.」+拡張子4文字の文字を除いたファイル名が一致すればスキップ
if /i "%tgfname:~0,-9%"=="%basefname%" goto :EOF


set fname1=%tgfname%
set fname2=""
:LOOP1
set /a n=n+1

if %n% GEQ 10000 goto :ERR1

if %n% LSS 10000 set fname2=%basefname%%n%%expfname%
if %n% LSS 1000 set fname2=%basefname%0%n%%expfname%
if %n% LSS 100 set fname2=%basefname%00%n%%expfname%
if %n% LSS 10 set fname2=%basefname%000%n%%expfname%


if EXIST "%fname2%" goto :LOOP1
rename "%fname1%" "%fname2%"
IF %ERRORLEVEL% EQU 1 goto :ERR2

rem 一旦、隠しファイルにしてforの対象から外し二度renameの対象になるのを防ぐ
attrib "%fname2%" +h

goto :EOF

:ERR1

rem 隠し属性を元に戻す
attrib "%BASE_F_NAME%*.*" -h

echo 対象ファイルが10000件を超えています。
pause
goto :EOF

:ERR2

rem 隠し属性を元に戻す
attrib "%BASE_F_NAME%*.*" -h

echo エラーレベル:%ERRORLEVEL% 重複ファイルあり:%fname1% → %fname2%、又はエラー
echo ファイル等確認の上、中止してください!
pause
goto :EOF
===

三桁バージョンと違う所は四ケタバージョンは赤文字ですがメモ帳にコピーすれば色は単色(黒?)に成ります。




【参考サイト】
バッチファイルの作り方
↓↓
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/201803/article_1.html




if文の三行は毎回メモリに書き込むことに成ります。
スマートにするなら

====
if %n% LSS 1000 set fname2=%basefname%%n%%expfname%
if %n% LSS 100 set fname2=%basefname%0%n%%expfname%
if %n% LSS 10 set fname2=%basefname%00%n%%expfname%
====
↓↓
====
if %n% LSS 10 (
set fname2=%basefname%00%n%%expfname%
) else if %n% LSS 100 (
set fname2=%basefname%0%n%%expfname%
) else if %n% LSS 1000 (
set fname2=%basefname%%n%%expfname%
)
====



エラー処理例、
【変更後のファイル名が存在する場合中止する】
(ただしABC_123もABC123もABCで引っかかる)
入力と同じ文字から始まるファイルが存在すれば中止します。
DIRで対象ファイルが無くエラーが出れば継続、エラーが無ければ中止(ファイルあり)
set /p BASE_F_NAME="変更後のベースのファイル名を入力してください?"
の後(次行)に追加
===
dir "%BASE_F_NAME%*.*" /w
IF %ERRORLEVEL% EQU 0 color C
IF %ERRORLEVEL% EQU 0 echo 入力文字から始まるファイル名あり
IF %ERRORLEVEL% EQU 0 echo ファイル等確認してください、処理を中止します!
IF %ERRORLEVEL% EQU 0 pause
IF %ERRORLEVEL% EQU 0 exit
IF %ERRORLEVEL% EQU 1 color B
echo 同ファイル名がないので処理を続けます。
echo ***** 処理中 *****
===

【注意】
現状のrename行
rename "%fname1%" "%fname2%"
の前の行「if EXIST "%fname2%" goto :LOOP1」で番号を一つ足すところに戻すので変更後のファイル名 "%fname2%"が存在すればそれはスキップし、通常は番号+1でリネイムされるかもしくは先に若い番号にリネイムされる (ABC_099→ABC_010等)コマンドプロンプト次第で若い番号へリネイムするか、そのファイル名を生かして、そのデータは弄らずスキップするか?どっちになるか不定。

rename "%fname1%" "%fname2%"
後のIF文エラー処理はrnameしようとする番号のファイル名が存在した場合、これは前述の通りあり得ず、逆の場合リネイムするファイルがない場合等(バグ?)のみ通常は中止します。
ただし、ファイルシステムのエラーや対象ファイルが使用されている場合等もあり得ます。




2018/03/06
for文でサブルーチンに飛ばしているが、for (*)がdirで取得するファイル名で繰り返されているようで、dirで前にくるデータファイル名変更は問題ないがdirで後ろにくるデータファイル名に変更される場合、二度対象となる。それを避ける最低限のエラー処理はしているが、念のため分かり易く一旦隠しファイルにした。




【改良】
途中の任意の番号から始める。以下をset n=0以降for文前に追加(エラー・アウトスペック処理なし)
数字は半角文字で入力のこと
===
set /p n="何番から始めますか?"
set /a n=n-1
===






2018/02/25 初稿につき誤字等ご容赦ください!
2018/03/04 V4 RH  同じファイルを二度rename回避、隠し属性で二度forの対象になるのを防ぐ
2018/03/06 V5 RH1 「rem 同じファイルを二度rename回避」後続の二行念のためREMを外した。
2018/03/16 V5x2 RH2 4桁バージョン追加 rem文追加 RH1→RH2へ変更

ブログ気持玉

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

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

→ログインへ

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

気持玉数 : 0

この記事へのコメント

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