批量修改文件名:将前缀替换为所在文件夹名(批处理求助)
批处理修正方案
你的代码核心问题是没有保留原文件名中Bf110G2_后的部分,直接用文件夹名替换了整个文件名主体,导致重命名结果不符合需求。以下是修正后的代码及说明:
修正后的批处理代码
@Echo OFF SetLocal EnableDelayedExpansion :: 递归遍历所有子文件夹 FOR /D /R %%# in (*) DO ( PUSHD "%%#" :: 筛选当前文件夹下以Bf110G2_开头的文件 FOR %%@ in ("Bf110G2_*") DO ( :: 提取原文件名(不含扩展名) set "orig_name=%%~n@" :: 将原文件名中的"Bf110G2"替换为当前文件夹名 set "new_name=!orig_name:Bf110G2=%%~n#!" :: 打印预览重命名操作(可删除该行直接执行) Echo 准备重命名: "%%@" → "!new_name!%%~x@" :: 执行重命名 Ren "%%@" "!new_name!%%~x@" ) POPD ) EndLocal Pause&Exit
关键修正点
- 启用延迟扩展:
SetLocal EnableDelayedExpansion解决for循环内部变量赋值与读取的同步问题,确保替换后的文件名能正确获取。 - 保留原文件后缀内容:通过字符串替换
!orig_name:Bf110G2=%%~n#!,仅替换前缀Bf110G2为当前文件夹名,保留原文件名中_之后的所有内容。 - 预览操作:
Echo行用于提前查看重命名结果,确认无误后可删除该行直接执行实际重命名。
特殊情况处理(匹配你的示例)
如果你的示例中ju88a4文件夹需要输出ju88_xxx(即截取文件夹名前4位),可在代码中添加文件夹名截取逻辑:
@Echo OFF SetLocal EnableDelayedExpansion FOR /D /R %%# in (*) DO ( PUSHD "%%#" :: 截取文件夹名前4位(可根据需求调整数字) set "folder_name=%%~n#" set "folder_short=!folder_name:~0,4!" FOR %%@ in ("Bf110G2_*") DO ( set "orig_name=%%~n@" set "new_name=!orig_name:Bf110G2=!folder_short!" Echo 准备重命名: "%%@" → "!new_name!%%~x@" Ren "%%@" "!new_name!%%~x@" ) POPD ) EndLocal Pause&Exit
内容的提问来源于stack exchange,提问作者Klunk
相关产品推荐
相关产品推荐

