Batch脚本如何替换文件名中下划线分隔符前的指定字符串
Batch脚本下划线前指定字符串替换方案
问题场景
我是Batch脚本初学者,尚未完全掌握相关知识点,此前查阅过子字符串操作的相关参考资料,但仍未实现分隔符前指定字符的替换逻辑。
待处理的文件名格式如下,文件名整体长度不固定:
File 1 : rem1020aa_10.zip File 2 : com12909aa_32.zip File 3 : fig129439aa_324.zip
明确需求
仅替换下划线_分隔符之前的aa字段,替换效果示例:
原文件名rem1020aa_10.zip → 替换后rem1020duh_10.zip
已尝试的无效方案
此前编写的固定偏移截取测试代码如下:
@echo off setlocal enableDelayedExpansion set arg1=%1 for /f "delims=" %%b in ('dir /b /s /a-d "C:\Test"') do ( set "arg1=%%~nxc" echo !arg1:~-6,2! )
运行后输出结果不符合预期:
09 43 0a
固定偏移位置截取的方案无法适配长度不固定的文件名,参考子串提取相关实现思路后也未达成目标。
可行实现代码
直接按下划线分割文件名后对前缀做替换即可,无需计算字符偏移,适配任意长度文件名:
@echo off setlocal enableDelayedExpansion :: 可自行修改配置项 set "target_old=aa" set "target_new=duh" set "scan_path=C:\Test" for /f "delims=" %%f in ('dir /b /s /a-d "%scan_path%"') do ( set "file_full=%%~nxf" :: 按下划线拆分文件名前缀、后缀 for /f "tokens=1* delims=_" %%pre in ("!file_full!") do ( set "name_pre=%%pre" set "name_suf=%%suf" :: 仅替换前缀中的目标字符串后拼接 set "name_new=!name_pre:%target_old%=%target_new%!_!name_suf!" :: 预览替换效果,确认无误后删除echo行、打开ren行即可执行重命名 echo 替换预览: !file_full! => !name_new! :: ren "%%f" "!name_new!" ) ) endlocal
实现说明
- 以
_作为分隔符拆分文件名,天然适配不同长度的文件名,不会出现偏移计算错误 - 替换逻辑仅作用于下划线前的文件名前缀,不会误改下划线后内容中可能存在的相同字符
- 默认仅打印替换效果做预览,避免误操作,确认结果符合预期后再开启重命名命令即可
内容的提问来源于stack exchange,提问作者Blaztolen
相关产品推荐
相关产品推荐

