如何按条件递归批量重命名SRT字幕文件至对应视频文件名?
解决递归批量重命名字幕文件的Batch脚本方案
我明白你折腾了好几个小时都没搞定这个字幕重命名的需求,你的场景和规则我都理得很清楚:要递归遍历目录树,把每个电影子文件夹里的SRT字幕文件,重命名为同目录下对应视频文件(AVI/MKV/MP4)的名字;如果有多个SRT文件,优先选体积最大的;如果字幕文件名里带有SDH标识,要把后缀改成视频文件名.SDH.srt。
先说说你原来脚本的核心问题:
- 没有正确实现递归遍历(
for /R的用法没结合目录处理逻辑) - 只处理了AVI格式,没覆盖MKV/MP4
- 批量
ren *.srt会把所有字幕改成同一个名字,导致后续文件直接覆盖前面的,这就是只能处理第一个文件的原因 - SDH的判断逻辑太粗糙,没考虑大小写(比如
ENG-SDH.SRT、randomstuff.eng.srt)和标识的不同位置 - 没有处理「多个SRT选最大文件」的优先级规则
完整解决方案脚本
@echo off setlocal enabledelayedexpansion :: 递归遍历所有子目录,替换PARENT_FOLDER为你的实际父目录路径 for /R "PARENT_FOLDER" %%D in (.) do ( :: 进入当前目录 pushd "%%D" :: 查找当前目录下的视频文件(AVI/MKV/MP4,不区分大小写) for %%V in (*.avi *.mkv *.mp4) do ( :: 获取视频文件的基础名(不含后缀) set "video_name=%%~nV" :: 收集当前目录下的所有SRT文件,按文件大小降序排序,取第一个(最大的) for /F "delims=" %%S in ('dir /B /O:-S /A:-D *.srt 2^>nul') do ( set "srt_file=%%S" goto :process_srt ) goto :next_dir :process_srt :: 判断当前SRT文件名是否包含SDH(不区分大小写) echo !srt_file! | findstr /I "SDH" >nul if !errorlevel! equ 0 ( :: 带SDH标识,重命名为 视频名.SDH.srt ren "!srt_file!" "!video_name!.SDH.srt" ) else ( :: 不带SDH,重命名为 视频名.srt ren "!srt_file!" "!video_name!.srt" ) ) :next_dir :: 回到上级目录 popd ) echo 字幕重命名完成! pause
脚本关键部分解释
- 递归遍历目录:
for /R "PARENT_FOLDER" %%D in (.) do会遍历指定父目录下的所有子目录,记得把PARENT_FOLDER替换成你的实际路径(比如D:\Movies)。 - 多格式视频匹配:
for %%V in (*.avi *.mkv *.mp4)覆盖了主流视频格式,确保不会遗漏目标文件。 - 选最大字幕文件:
dir /B /O:-S /A:-D *.srt会列出当前目录的SRT文件并按体积从大到小排序,for /F取第一个结果就是优先级最高的字幕文件。 - 智能SDH识别:
findstr /I "SDH"不区分大小写查找SDH字符串,不管标识在文件名的开头、中间还是结尾都能正确识别。 - 延迟变量扩展:
setlocal enabledelayedexpansion确保循环内部修改的变量能被正确读取,避免batch脚本的变量作用域问题。
测试建议
- 首次测试可以把
ren改成echo ren,先预览所有重命名操作,确认逻辑正确后再实际执行。 - 如果某个目录下有多个视频文件,脚本会对每个视频都处理一次字幕,但你的场景里每个电影文件夹通常只有一个视频,这个情况可以忽略。
内容的提问来源于stack exchange,提问作者user2826193
相关产品推荐
相关产品推荐

