批量使用filename中的子字符串重命名文件

时间:2018-02-01 23:18:01

标签: batch-file

如果可能的话,我希望创建一个批处理文件,该文件可以通过一个看似随机的文件名填充文件夹,并使用每个文件名中存在的子字符串重命名它们。命名约定似乎很随机,但在每个文件名中都存在" a"然后是2位数字,然后是" b"后跟2位数字(## b ##)。这些值都不匹配,因此您无需担心生成的文件名相互冲突。

before:
left.process.a11b22.Feb.11
maid island a22b33 Mar 12
charm.dinner.a12b34.Jun.13
motivation blame a00b00 Nov 14
laser.activate.a99b99.Oct.15

我希望将这些重命名为更易于管理的一致性,同时保留相关值。理想情况下,将它们重命名为文件夹的名称,后跟子字符串。

Ideal result:
Folder Name a00b00
Folder Name a11b22
Folder Name a12b34
Folder Name a22b33
Folder Name a99b99

这已经问了很多,这并不重要,但如果可以递归地完成,那将节省额外的一步。甚至可能忽略任何在其名称中没有子字符串的文件。但是,我从未设法遇到过可以递归重命名考虑每个文件夹名称的批处理。无论如何,提前谢谢。

1 个答案:

答案 0 :(得分:0)

我希望这就是你要找的东西:

@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

a[0-9][0-9]b[0-9][0-9]方案匹配的每个文件都会重命名为folder_name - a[0-9][0-9]b[0-9][0-9](如果您不希望-只是调整REN命令)。

对于a??b??A??b??A??B??a??B??计划的区分大小写重命名:

@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

这不应该比第一个解决方案花费更长的时间。

编辑:

18年2月2日:

现在应该更快。谢谢@Squashman

18年3月2日:

添加了区分大小写的重命名,错误和成功输出以及计数器以防止无限循环。

18年5月2日:

固定变量编辑。

如果您想使用其他方案,只需调整Variable EditFINDSTR和/或Substring位。