求修改HandBrake批处理脚本:转码后保留目录结构输出至指定路径
修复HandBrakeCLI批处理脚本:按原目录结构输出转码文件并删除原文件
你当前脚本的核心问题是move命令的路径拼接逻辑错误——直接将原文件的完整驱动器+路径拼到目标目录后,会生成无效的嵌套路径(比如E:\downloads\converted\E:\downloads\complete\Some Subfolder\...),导致无法按原目录结构输出。以下是修改后的完整脚本:
@echo off setlocal enabledelayedexpansion :: 定义核心路径和工具变量,方便后续维护修改 set "SOURCE_DIR=E:\downloads\complete" set "TARGET_DIR=E:\downloads\converted" set "HANDBRAKE_CLI=D:\HandBrakeCLI\HandBrakeCLI.exe" set "PRESET_FILE=D:\HandBrakeCLI\VCEmp4HVEC.json" set "PRESET_NAME=VCEmp4HVEC" :: 遍历源目录下所有指定格式的视频文件 for /R "%SOURCE_DIR%" %%F in (*.mkv,*.avi,*.mp4) do ( :: 执行转码,临时输出到原文件同目录 "%HANDBRAKE_CLI%" --preset-import-file "%PRESET_FILE%" -Z "%PRESET_NAME%" -i "%%~fF" -o "%%~dpF%%~nF.mp4" :: 检查转码是否成功生成文件 if exist "%%~dpF%%~nF.mp4" ( :: 提取原文件相对于源目录的路径部分(去掉源目录前缀) set "RELATIVE_PATH=%%~dpF" set "RELATIVE_PATH=!RELATIVE_PATH:%SOURCE_DIR%=!" :: 在目标目录创建对应的子目录(不存在则创建) if not exist "%TARGET_DIR%!RELATIVE_PATH!" mkdir "%TARGET_DIR%!RELATIVE_PATH!" :: 将转码后的文件移动到目标目录的对应路径 move "%%~dpF%%~nF.mp4" "%TARGET_DIR%!RELATIVE_PATH!%%~nF.mp4" :: 删除原文件 del "%%~fF" ) ) endlocal
关键逻辑说明
setlocal enabledelayedexpansion:启用延迟变量扩展,确保循环内修改的变量能实时读取到最新值。- 路径变量定义:把源目录、目标目录、工具路径都设为变量,后续修改时不用逐行查找。
- 相对路径提取:通过字符串替换,去掉原文件路径中的源目录前缀,得到相对于源目录的子路径。
- 目录预创建:转码文件移动前先创建目标子目录,避免因路径不存在导致move失败。
- 操作顺序:先确认转码成功,再移动文件,最后删除原文件,避免转码失败时误删原文件。
内容的提问来源于stack exchange,提问作者Jarrett Tennis
相关产品推荐
相关产品推荐

