You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 20:27:16