批处理重命名脚本优化:支持子文件夹遍历及TXT名指定位置插入JPG名
批处理重命名脚本优化实现方案
原脚本基础逻辑
原有脚本实现一级子目录遍历,将同目录下jpg文件名追加到对应txt文件名末尾,原代码如下:
for /d %%D in ("*") do ( for %%F in ("%%D\*.jpg") do ( ren "%%~dpF(*).txt" "(*) %%~nF.*" ) )
原脚本执行效果:
Before filename.jpg (1).txt Result filename.jpg (1) filename.txt
优化需求
- 增加可控的子文件夹遍历能力,可自由切换仅一级子目录扫描/全层级递归扫描
- 调整重命名规则,将jpg文件名插入到txt原文件名的两段括号内容中间,目标效果如下:
Before filename.jpg (1)(name).txt Result filename.jpg (1) filename (name).txt
原有尝试方案的共性问题
之前写的三个方案均未生效,核心问题有三点:
- 遍历逻辑脱节:dir查找文件的逻辑和后续jpg匹配逻辑没有做路径关联,容易出现跨目录错配
- 通配符用法错误:cmd的
ren命令通配符不支持多段*匹配插入内容的场景,无法直接通过(*) 内容 (*)的格式实现中间插入 - 命令语法错误:
for /d本身不支持解析dir /s的命令输出,直接嵌套会导致遍历完全失效
最终可行代码
@echo off setlocal enabledelayedexpansion :: ========== 配置项 ========== :: 遍历深度控制:0=仅扫描当前目录下一级子文件夹(和原脚本行为一致),1=递归扫描所有层级子文件夹 set "SCAN_RECURSIVE=0" :: 需匹配的txt文件格式 set "TXT_MATCH_PATTERN=(*)(*).txt" :: ============================ :: 根据配置生成目录遍历命令 if %SCAN_RECURSIVE% equ 1 ( set "SCAN_CMD=dir /b /s /ad" ) else ( set "SCAN_CMD=dir /b /ad" ) :: 遍历目标目录 for /f "delims=" %%D in ('!SCAN_CMD!') do ( :: 遍历目录下所有jpg文件 for %%F in ("%%D\*.jpg") do ( set "JPG_NAME=%%~nF" set "WORK_DIR=%%~dpF" :: 遍历同目录下符合格式的txt文件 for %%T in ("!WORK_DIR!%TXT_MATCH_PATTERN%") do ( set "TXT_OLD_FULLNAME=%%~nT" :: 拆分txt原文件名的前后段 for /f "tokens=1* delims=)" %%A in ("!TXT_OLD_FULLNAME!") do ( set "NAME_PREFIX=%%A)" set "NAME_SUFFIX=%%B" set "TXT_NEW_NAME=!NAME_PREFIX! !JPG_NAME! !NAME_SUFFIX!%%~xT" ren "%%T" "!TXT_NEW_NAME!" ) ) ) ) endlocal
使用说明
- 调整遍历深度:修改代码开头
SCAN_RECURSIVE的值即可,0为一级子目录扫描,1为全层级递归扫描 - 重命名逻辑:自动拆分txt原文件名中第一个
)前后的内容,将jpg文件名插入到两段内容中间,完全匹配目标命名格式 - 匹配规则:仅对和jpg同目录、且文件名符合
(*)(*).txt格式的文件执行重命名,不会出现误改
效果验证
配置为一级子目录扫描时,执行结果完全符合预期:Before filename.jpg (1)(name).txt Result filename.jpg (1) filename (name).txt
内容的提问来源于stack exchange,提问作者JR Santos
相关产品推荐
相关产品推荐

