I hope this is what you are looking for:
@ECHO OFF
SETLOCAL EnableDelayedExpansion
REM **************************************************
REM Source directory
SET source=C:\adjust\path
REM **************************************************
FOR /R "%source%" %%G IN ("*a??b??*") DO (
SET "file_name=%%~nG"
SET "counter=0"
SET "error=0"
ECHO !file_name! | FINDSTR /B /R "a[0-9][0-9]b[0-9][0-9]" >nul || CALL :get_file_name
ECHO !file_name! | FINDSTR /I /B /R "a[0-9][0-9]b[0-9][0-9]" >nul && FOR %%H IN ("%%~dpG.") DO (SET "folder_name=%%~nxH") && REN "%%G" "!folder_name! - !file_name!%%~xG"
IF "%error%"=="1" (ECHO Error: Cannot rename %%G^^!) ELSE (ECHO !folder_name! - !file_name!%%~xG)
)
ECHO Done^^!
PAUSE
EXIT
:get_file_name
IF !counter! LSS 10 (SET /A "counter=!counter!+1") ELSE (SET "error=1" & EXIT /B)
SET file_name=!file_name:*a=a!
ECHO !file_name! | FINDSTR /B /R "a[0-9][0-9]b[0-9][0-9]" >nul || SET file_name=!file_name:~1! || GOTO get_file_name
SET file_name=!file_name:~0,6!
EXIT /B
Each file that matches the a[0-9][0-9]b[0-9][0-9]
scheme is getting renamed to folder_name - a[0-9][0-9]b[0-9][0-9]
(if you do not want the -
simply adjust the REN
command).
For case-sensitive renaming of a??b??
, A??b??
, A??B??
and a??B??
scheme:
@ECHO OFF
SETLOCAL EnableDelayedExpansion
REM **************************************************
REM Source directory
SET source=C:\adjust\path
REM **************************************************
FOR /R "%source%" %%G IN ("*a??b??*") DO (
SET "file_name=%%~nG"
SET "counter=0"
SET "error=0"
ECHO !file_name! | FINDSTR /R "a[0-9][0-9]b[0-9][0-9] a[0-9][0-9]B[0-9][0-9]" >nul && CALL :small_a
ECHO !file_name! | FINDSTR /R "A[0-9][0-9]b[0-9][0-9] A[0-9][0-9]B[0-9][0-9]" >nul && CALL :capital_a
ECHO !file_name! | FINDSTR /I /B /R "a[0-9][0-9]b[0-9][0-9]" >nul && FOR %%H IN ("%%~dpG.") DO (SET "folder_name=%%~nxH") && REN "%%G" "!folder_name! - !file_name!%%~xG"
IF "%error%"=="1" (ECHO Error: Cannot rename %%G^^!) ELSE (ECHO !folder_name! - !file_name!%%~xG)
)
ECHO Done^^!
PAUSE
EXIT
:small_a
IF !counter! LSS 10 (SET /A "counter=!counter!+1") ELSE (SET "error=1" & EXIT /B)
SET file_name=!file_name:*a=a!
ECHO !file_name! | FINDSTR /I /B /R "a[0-9][0-9]b[0-9][0-9]" >nul || SET file_name=!file_name:~1! || GOTO small_a
SET file_name=!file_name:~0,6!
EXIT /B
:capital_a
IF !counter! LSS 10 (SET /A "counter=!counter!+1") ELSE (SET "error=1" & EXIT /B)
SET file_name=!file_name:*A=A!
ECHO !file_name! | FINDSTR /I /B /R "A[0-9][0-9]b[0-9][0-9]" >nul || SET file_name=!file_name:~1! || GOTO capital_a
SET file_name=!file_name:~0,6!
EXIT /B
This shouldn't take much longer than the first solution.
Edit:
02/02/18:
Should be faster now. Thanks @Squashman!
03/02/18:
Added case-sensitive renaming, error and success output and counter to prevent endless loop.
05/02/18:
Fixed variable edit.
If you want to use another scheme simply adjust the Variable Edit, FINDSTR
and/or Substring bit.