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

批处理脚本报错‘missing operands’且秒数计算异常求助

问题原因与修复方案

问题根源

  1. 八进制数字解析错误:批处理的set /a命令会将以0开头的数字视为八进制数,但八进制仅包含0-7,遇到08、09这类数字时会触发Invalid number错误,导致秒数变量赋值失败(比如08无法被解析,seconds变量保持为0),最终计算出错误的总秒数(如17分08秒被算成17×60=1020)。
  2. 固定长度截取导致的截断:原脚本中set "duration=!duration:~0,12!"的固定长度截取操作,可能会截断秒数的有效数字,进一步引发计算偏差。

修复后的脚本

@echo off
setlocal enabledelayedexpansion

set "output_file=output.txt"

rem 删除已存在的输出文件
if exist "%output_file%" del "%output_file%"

for %%i in (*.mp4 *.avi *.mkv *.mov *.wmv *.flv *.mpeg *.mpg) do (
    set "input_file=%%i"
    set "duration="
    set "hhmmss="
    set "total_seconds=0"

    rem 用ffmpeg提取时长信息
    for /f "tokens=*" %%a in ('ffmpeg -i "!input_file!" 2^>^&1 ^| find "Duration"') do (
        set "duration_line=%%a"
        rem 提取Duration后面的时间部分,去掉"Duration: "前缀
        set "duration=!duration_line:*Duration: =!"
        rem 截取到逗号之前,去除后面的无关信息
        for /f "tokens=1 delims=," %%x in ("!duration!") do set "duration=%%x"
    )

    rem 处理时长计算,避免前导0导致的八进制解析错误
    if defined duration (
        for /f "tokens=1-3 delims=:" %%a in ("!duration!") do (
            set "hours_raw=%%a"
            set "minutes_raw=%%b"
            rem 拆分秒和毫秒
            for /f "tokens=1 delims=." %%d in ("%%c") do set "seconds_raw=%%d"

            rem 将前导0的数字转换为十进制(避免八进制解析错误)
            set /a "hours=100%%hours_raw %% 100"
            set /a "minutes=100%%minutes_raw %% 100"
            set /a "seconds=100%%seconds_raw %% 100"

            set /a "total_seconds=hours*3600 + minutes*60 + seconds"

            rem 格式化hh:mm:ss格式的时长字符串
            set "hhmmss=0%%hours_raw" & set "hhmmss=!hhmmss:~-2!"
            set "hhmmss=!hhmmss!:0%%minutes_raw" & set "hhmmss=!hhmmss:~-5!"
            set "hhmmss=!hhmmss!:0%%seconds_raw" & set "hhmmss=!hhmmss:~-8!"
        )
    )

    rem 写入结果到输出文件
    echo Filename: "!input_file!" >> "%output_file%"
    echo Duration: !hhmmss! >> "%output_file%"
    echo Total Seconds: !total_seconds! >> "%output_file%"
    echo. >> "%output_file%"
)

echo 输出已写入到 "%output_file%"

endlocal

修复说明

  • 精准提取时长:通过字符串替换和分割操作,直接提取ffmpeg输出中Duration:后的完整时间部分(到逗号为止),避免固定长度截取导致的截断问题。
  • 解决八进制解析问题:使用100%%变量 %% 100的计算方式,将带前导0的数字强制转换为十进制(比如08会被转换为8),彻底避免set /a的解析错误。
  • 变量初始化:处理每个文件前初始化时长相关变量,防止上一个文件的残留值影响当前计算结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:50:30