Windows批处理文件中的正则表达式

时间:2014-01-16 12:43:06

标签: regex windows batch-file rename

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

目标是在文件的开头设置17-25个字符。

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

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

<00> 0001 002822972 027 001446839 _TB-E .pdf - &gt; 001446839 0001 002822972 027 _TB-E .pdf

3 个答案:

答案 0 :(得分:4)

@ECHO OFF
SETLOCAL
SET "sourcedir=c:\sourcedir"
FOR /f "delims=" %%a IN (
 'dir /b /a-d "%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。在您确认命令正确无误后,将ECHO REN更改为REN以实际重命名文件。

请注意,您提供的第一个示例在转换后的版本中有{39 3 _TB-E ...,3缺失。

答案 1 :(得分:1)

这可以在REPL.BAT - a hybrid JScript/batch utility that performs a regex search and replace on each line from stdin and writes the result to stdout的帮助下非常简单地完成。该实用程序仅使用从XP开始可用于任何现代Windows机器的本机脚本功能;无需第三方可执行文件。完整的文档嵌入在脚本中。

假设REPL.BAT位于PATH中的某个位置:

@echo off
pushd "c:\sourcePath"
for /f "delims=" %%A in (
  'dir /b /a-d *.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 /a-d *.pdf') do (
  set "file=%%F"
  setlocal enableDelayedExpansion
  ren "!file!" "!file:~16,9!!file:~0,17!*"
  endlocal
)
popd

如果您知道没有任何文件名包含!字符,那么您可以在顶部启用延迟扩展,并从循环中删除SETLOCAL和ENDLOCAL。

上述两种解决方案都依赖于目标名称末尾的*将保留原始文件名的其余部分这一事实。有关详细信息,请参阅How does the Windows RENAME command interpret wildcards?

答案 2 :(得分:-2)

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

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