Windowsbatch file中的正则expression式

我正在寻找使用批处理作业重命名多个文件的方法。 是的,我知道有很多应用程序可以实现这一点。 但是我需要一个自动化的方式,就像一个batch file,我可以从调度程序(SOS Job Scheduler)调用。 我们需要每天重命名数百个文件!

目标是在文件开头设置17-25个charcaters。

  • 00010028229720270014468393_TB-E.pdf – > 00144683930001002822972027_TB-E.pdf
  • 000100282297202700144683931ESR-AF.pdf – > 001446839300010028229720271ESR-AF.pdf
  • 00010031141040250016353371ESR-AF.pdf – > 00163533700010031141040251ESR-AF.pdf
  • 0001003167580004001667217KTO.pdf – > 0016672170001003167580004KTO.pdf

这里有一个更清晰的例子:

0001 002822972 027 001446839 _TB-E .pdf – > 001446839 0001 002822972 027 _TB-E .pdf

@ECHO OFF SETLOCAL SET "sourcedir=c:\sourcedir" FOR /f "delims=" %%a IN ( 'dir /b /ad "%sourcedir%\*" ' ) DO ( SET "name=%%a" CALL :transform ) GOTO :EOF :transform ECHO REN "%sourcedir%\%name%" "%name:~16,9%%name:~0,16%%name:~25%" GOTO :eof 

所需的REN命令仅用于测试目的。 在确认命令正确后,将ECHO REN更改为REN以实际重命名文件。

请注意,你提交的第一个例子有… 39 3 _TB-E …在转换后的版本中,缺少3

这可以通过REPL.BAT(一个混合的JScript /批处理实用程序)来实现,该工具执行正则表达式搜索,并从stdin的每一行代替并将结果写入stdout 。 该实用程序只使用原生脚本功能,可用于任何现代Windows机器从XP以上; 不需要第三方可执行文件。 完整的文档被嵌入在脚本中。

假设REPL.BAT在你的PATH中:

 @echo off pushd "c:\sourcePath" for /f "delims=" %%A in ( 'dir /b /ad *.pdf ^| repl "(.{16})(.{9}).*" "ren \q$&\q \q$2$1*\q" x' ) do %%A popd 

只使用本地批处理命令,不使用任何CALL:

 @echo off setlocal disableDelayedExpansion pushd "c:\sourcePath" for /f "delims=" %%F in ('dir /b /ad *.pdf') do ( set "file=%%F" setlocal enableDelayedExpansion ren "!file!" "!file:~16,9!!file:~0,17!*" endlocal ) popd 

如果你知道你的文件名都不包含! 字符,那么您可以简单地在顶部启用延迟扩展,并从循环中删除SETLOCAL和ENDLOCAL。

上面的两个解决方案都依赖于*在目标名称末尾将保留原始文件名的其余部分的事实。 请参阅Windows RENAME命令如何解释通配符? 获取更多信息。

 (\d{16})(\d+)(.*?\.pdf) -> \2\1\3 

{16}表示你重复16次(数字)