如何在定时批处理文件中运行FFmpeg并实现文件排除与原文件删除?
解决MKV转AAC后的自动删原文件与跳过已转换文件问题
嘿,你已经搭好了定时转码的批处理框架,剩下的两个需求其实很容易实现,我直接给你改好代码,再逐行解释逻辑:
修改后的完整批处理代码
@echo off setlocal enabledelayedexpansion :: 遍历目标目录下所有MKV文件,递归包含子文件夹 for /r "C:\Users\USER\Desktop\TEST" %%a in ("*.mkv") do ( :: 检查当前文件名是否包含CONVERTED(不区分大小写),如果不包含才处理 echo "%%~nxa" | findstr /i "CONVERTED" >nul if !errorlevel! equ 1 ( :: 构造输出文件名:原路径+原文件名+_CONVERTED.mkv set "output=%%~dpna_CONVERTED.mkv" :: 执行转码:复制视频流,音频转AAC(比特率可自行调整) ffmpeg -i "%%a" -vcodec copy -acodec aac -b:a 192k "!output!" :: 检查转码是否成功,成功则删除原文件 if !errorlevel! equ 0 ( echo ✅ 转码完成,已删除原文件:"%%a" del "%%a" ) else ( echo ❌ 转码失败,保留原文件:"%%a" :: 清理转码失败生成的不完整文件 if exist "!output!" del "!output!" ) ) ) echo 所有转码任务已执行完毕! pause
关键功能实现说明
- 跳过已转换文件:通过
findstr /i "CONVERTED"检查文件名,只要文件名(含扩展名)里包含CONVERTED(不区分大小写,比如xxx_converted.mkv也会被跳过),就跳过处理。转码后的文件会自动加上_CONVERTED后缀,确保下次运行时不会重复处理。 - 转换完成后删除原文件:通过判断ffmpeg的退出码
!errorlevel! equ 0(0表示执行成功),只有转码完全成功才会删除原文件,避免转码失败误删源文件。如果转码失败,还会自动清理生成的不完整输出文件,避免残留垃圾。 - 额外优化:启用
enabledelayedexpansion是为了在循环里正确读取变量值;-vcodec copy直接复制视频流,不用重新编码,能大幅节省转码时间(如果你的需求是只转音频,这个参数一定要加)。
注意事项
- 如果你的ffmpeg没有添加到系统环境变量
PATH里,要把代码里的ffmpeg改成完整路径,比如"C:\Program Files\ffmpeg\bin\ffmpeg.exe"。 - 可以根据自己的需求调整AAC的比特率(
-b:a 192k),比如改成256k获得更好的音质。 - 建议先在测试文件夹里小范围测试,确认功能正常后再放到定时任务里。
内容的提问来源于stack exchange,提问作者MrZoops
相关产品推荐
相关产品推荐

