批处理脚本遇文件名含感叹号(!)无法正常编码求助
批处理脚本处理含感叹号文件名的修复方案
问题根源
启用SETLOCAL EnableDelayedExpansion后,批处理会将!识别为延迟变量的边界符号。当文件名包含!时,%%a、%%~na等变量会被错误解析,导致文件名丢失部分字符,最终传递给HandbrakeCLI的输入/输出路径异常,触发"Missing output file name"错误。
修复后的脚本
@echo off SETLOCAL DisableDelayedExpansion echo Handbrake_Encode_MKV_offPeak-beta.bat for /r %%a in (*.mkv) do ( call :sleepUtilOffPeak rem 在禁用延迟扩展环境下赋值,完整保留文件名中的! set "filename=%%~na" set "drive_and_path=%%~dpa" rem 临时启用延迟扩展拼接路径并执行编码 SETLOCAL EnableDelayedExpansion echo Calling Handbrake to encode^: !drive_and_path!!filename!.mp4 "C:\Scripts\HandBrakeCLI.exe" -v 0 --preset-import-file "C:\Scripts\Fast 1080p30-subs.json" -Z "Fast 1080p30-subs" -i "%%a" -o "!drive_and_path!!filename!.mp4" rem 恢复禁用延迟扩展的环境,避免影响后续循环 ENDLOCAL ) echo encoding complete. Exiting... exit /B 0
关键修改说明
- 初始禁用延迟扩展:确保
for /r遍历文件时,含!的文件名能被完整读取,不会被批处理引擎错误解析。 - 循环内切换延迟扩展状态:
- 先在禁用状态下给
filename和drive_and_path赋值,保留变量中的!字符。 - 临时启用延迟扩展完成路径拼接与Handbrake调用,执行后立即恢复禁用状态,保证下一次循环的文件名解析正常。
- 先在禁用状态下给
内容的提问来源于stack exchange,提问作者busthead
相关产品推荐
相关产品推荐

