批处理脚本报错‘missing operands’且秒数计算异常求助
问题原因与修复方案
问题根源
- 八进制数字解析错误:批处理的
set /a命令会将以0开头的数字视为八进制数,但八进制仅包含0-7,遇到08、09这类数字时会触发Invalid number错误,导致秒数变量赋值失败(比如08无法被解析,seconds变量保持为0),最终计算出错误的总秒数(如17分08秒被算成17×60=1020)。 - 固定长度截取导致的截断:原脚本中
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
相关产品推荐
相关产品推荐

