我正在寻找使用批处理作业重命名多个文件的方法。 是的,我知道有很多应用程序可以实现这一目标。 但我需要一种自动方式,比如批处理文件,我可以从调度程序(SOS Job Scheduler)调用。我们需要每天重命名数百个文件!
目标是在文件的开头设置17-25个字符。
这里有一个更清晰的例子:
<00> 0001 002822972 027 001446839 _TB-E .pdf - &gt; 001446839 0001 002822972 027 _TB-E .pdf答案 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次(数字)