我正在尝试使用批处理来重命名文件 “Rapp_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
的文件名中留下日期/时间部分的长度是可变的。cmd.exe
有特殊含义的字符,甚至可以用双引号括起来,例如 !
和 %
。在这种情况下,使用批处理文件的解决方案需要更复杂的代码,例如:
@echo off
setlocal EnableDelayedExpansion DisableDelayedExpansion
(for /F "eol=| delims=" %%I in ('dir "*_*_*.*" /A-D /B 2^>nul ^| %SystemRoot%\System32\findstr.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
是具有一位或多位数字的数字),它就确实有效。该数字未通过正则表达式验证,因为搜索字符串对于 FINDSTR 来说会变得太长。
这两个批处理文件都不处理将文件重命名为另一个文件或目录已在当前目录中的名称的用例。它也不处理文件重命名失败的用例,因为该文件当前由其他进程拒绝共享访问的应用程序打开。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
call /?
cmd /?
dir /?
echo /?
endlocal /?
findstr /?
for /?
goto /?
ren /?
set /?
setlocal /?
阅读有关 使用命令重定向运算符的 Microsoft 文档,了解
|
和 2>nul
的说明。重定向运算符 |
和 >
必须在 FOR命令行上使用脱字符号
^
进行转义,以便在 Windows 命令解释器在执行执行嵌入命令的命令 FOR 之前处理此命令行时将其解释为文字字符与 dir
和 findstr
一致,使用使用选项 /c
在后台启动的单独命令进程,并将命令行作为附加参数附加。
另请参阅 使用 Windows 批处理文件的单行多个命令,了解无条件命令运算符
&
在双引号参数字符串之外的命令行中找到的说明,并且也未使用 ^
进行转义以解释为字面字符。