我正在尝试使用批处理重命名来自"Rap_20220628150328_001.tif";至";Rapp_YYYY_MM_GG_001.tif";
添加";Rap_;日期不是问题,但我不明白如何保留最后8个字符"_001.tif";
提前感谢
用于重命名文件
Rapp_20220628150328_001.tif
Rapp_20220628150436_002.tif
在当前目录中到
Rapp_2022_06_28_001.tif
Rapp_2022_06_28_002.tif
只需要一个具有以下命令行的批处理文件:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
for /F %%I in ('dir "Rapp_*_*.tif" /B') do (
set "FileName=%%I"
ren "%%I" "!FileName:~0,9!_!FileName:~9,2!_!FileName:~11,2!!FileName:~19!"
)
endlocal
但是这个简单的解决方案不适用于包含以下文件的目录:
Image_1.Develop & Test(!)_100%_2022-06-27_01.tif
Image_1.Develop & Test(!)_100%_20220628150328_02.tif
Rapp_2022-06-27_001.tif
Rapp_20220628150328_003.tif
Rapp_20220628150436_002.tif
该目录中的文件名应最终命名为:
Image_1.Develop & Test(!)_100%_2022-06-27_01.tif
Image_1.Develop & Test(!)_100%_2022_06_28_02.tif
Rapp_2022-06-27_001.tif
Rapp_2022_06_28_002.tif
Rapp_2022_06_28_003.tif
有以下标准需要考虑:
- 格式为
yyyyMMddHHmmss
的文件名中保留到日期/时间的部分长度是可变的 - 文件名中保留到日期/时间的部分可以有多个下划线
- 文件名可以包含对Windows命令处理器
cmd.exe
在处理批处理文件时具有特殊意义的字符,即使是用双引号括起来(如!
和%
)也是如此 - 文件名中留给文件扩展名的位数也是可变的
- 目录中有一些文件已经具有所需的格式
在这种情况下,具有批处理文件的解决方案需要更复杂的代码,如:
@echo off
setlocal EnableDelayedExpansion DisableDelayedExpansion
(for /F "eol=| delims=" %%I in ('dir "*_*_*.*" /A-D /B 2^>nul ^| %SystemRoot%System32findstr.exe /R "_[12][0123456789][0123456789][0123456789][01][0123456789][0123][0123456789][012][0123456789][012345][0123456789][012345][0123456789]_"') do set "FileName=%%~nI" & call :RenameFile "%%~xI") & goto EndBatch
:RenameFile
set "ModifiedName=%FileName:.=|%
for %%J in ("%ModifiedName:_=.%") do set "FileNumber=%%~xJ" & for %%K in ("%%~nJ") do set "DateTime=%%~xK" & set "FirstPart=%%~nK"
set "FirstPart=%FirstPart:.=_%"
ren "%FileName%%~1" "%FirstPart:|=.%_%DateTime:~1,4%_%DateTime:~5,2%_%DateTime:~7,2%_%FileNumber:~1%%~1"
goto :EOF
:EndBatch
endlocal
这种通用解决方案的执行速度比简单的解决方案慢,但只要文件名以_yyyyMMddHHmmss_n.*
结尾,n
就是一个或多个数字,它就可以工作。正则表达式未验证该数字,因为FINDTR的搜索字符串太长。
这两个批处理文件都不处理将文件重命名为另一个文件或目录已在当前目录中的名称的用例。它也不处理由于文件当前由其他进程拒绝共享访问的应用程序打开而导致文件重命名失败的用例。
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在那里执行以下命令,并完整仔细地阅读每个命令显示的帮助页。
call /?
cmd /?
dir /?
echo /?
endlocal /?
findstr /?
for /?
goto /?
ren /?
set /?
setlocal /?
阅读有关使用命令重定向运算符的Microsoft文档以了解|
和2>nul
的说明。重定向运算符|
和>
必须在FOR命令行上用插入字符^
转义,以便在Windows命令解释器处理此命令行时被解释为文字字符,然后再执行命令FOR,该命令使用中启动的单独命令进程执行带有dir
和findstr
的嵌入式命令行带有选项/c
和附加为附加参数的命令行的背景。
另请参阅使用Windows批处理文件的单行多个命令,以了解无条件命令运算符&
在双引号参数字符串之外的命令行中被发现并且没有用^
转义以解释为文字字符的说明。