Batch脚本如何通过变量索引访问数组实现批量文件重命名
问题原因
Batch 不支持直接嵌套使用延迟扩展变量,!Pattern[!counter!]! 属于非法语法,无法正确读取数组元素。同时你写的替换逻辑中,搜索串和替换串也不能直接嵌套数组取值语法,需要提前解析为固定值。
解决方法
通过 for 循环的可替换参数中转索引值,就能正常读取数组元素,示例用法如下:
:: 假设counter是已赋值的索引变量 for %%i in (!counter!) do ( set "currentPattern=!Pattern[%%i]!" set "currentReplace=!Replace[%%i]!" )
修正后的完整脚本
如果你需要的是第N个PDF文件固定使用第N组模式对做替换(即你原有代码的逻辑),修正后代码如下:
@ECHO OFF Setlocal enabledelayedexpansion :: 按需修改/扩展你的模式和替换串 Set "Pattern[0]=pat0" Set "Pattern[1]=pat1" Set "Pattern[2]=pat2" Set "Replace[0]=rep0" Set "Replace[1]=rep1" Set "Replace[2]=rep2" Set /a counter = 0 For /r %%# in (*.pdf) Do ( :: 中转索引读取数组元素 for %%i in (!counter!) do ( set "curPat=!Pattern[%%i]!" set "curRep=!Replace[%%i]!" ) Set "oldName=%%~nx#" :: 生成替换后的文件名 call set "newName=%%oldName:!curPat!=!curRep!%%" :: 执行重命名 Ren "%%#" "!newName!" Set /a counter += 1 ) endlocal
额外优化说明
如果你的实际需求是每个PDF文件检查所有预设模式,匹配到对应模式就执行替换,更符合批量重命名的常规逻辑,可使用以下脚本:
@ECHO OFF Setlocal enabledelayedexpansion :: 先设置模式对最大索引 set "maxPatternIndex=2" Set "Pattern[0]=pat0" Set "Pattern[1]=pat1" Set "Pattern[2]=pat2" Set "Replace[0]=rep0" Set "Replace[1]=rep1" Set "Replace[2]=rep2" For /r %%# in (*.pdf) Do ( set "fileName=%%~nx#" :: 遍历所有模式对做匹配替换 for /l %%i in (0,1,%maxPatternIndex%) do ( call set "fileName=%%fileName:!Pattern[%%i]!=!Replace[%%i]!%%" ) Ren "%%#" "!fileName!" ) endlocal
内容的提问来源于stack exchange,提问作者shole
相关产品推荐
相关产品推荐

