You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批处理脚本遇文件名含感叹号(!)无法正常编码求助

批处理脚本处理含感叹号文件名的修复方案

问题根源

启用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

关键修改说明

  1. 初始禁用延迟扩展:确保for /r遍历文件时,含!的文件名能被完整读取,不会被批处理引擎错误解析。
  2. 循环内切换延迟扩展状态:
    • 先在禁用状态下给filename和drive_and_path赋值,保留变量中的!字符。
    • 临时启用延迟扩展完成路径拼接与Handbrake调用,执行后立即恢复禁用状态,保证下一次循环的文件名解析正常。

内容的提问来源于stack exchange,提问作者busthead

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:50:29