如果可能的话,我希望创建一个批处理文件,该文件可以通过一个看似随机的文件名填充文件夹,并使用每个文件名中存在的子字符串重命名它们。命名约定似乎很随机,但在每个文件名中都存在" 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
这已经问了很多,这并不重要,但如果可以递归地完成,那将节省额外的一步。甚至可能忽略任何在其名称中没有子字符串的文件。但是,我从未设法遇到过可以递归重命名考虑每个文件夹名称的批处理。无论如何,提前谢谢。
答案 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
这不应该比第一个解决方案花费更长的时间。
现在应该更快。谢谢@Squashman!
添加了区分大小写的重命名,错误和成功输出以及计数器以防止无限循环。
固定变量编辑。
如果您想使用其他方案,只需调整Variable Edit,FINDSTR
和/或Substring位。