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

使用CMD及MediaInfo生成含文件名、时长、大小的三列CSV遇阻求助

修复你的CMD+MediaInfo媒体信息提取脚本

我看了你的脚本,问题主要出在变量捕获方式和CMD延迟扩展这两个核心点上,接下来我给你拆解问题并提供修复后的完整方案:

原代码的主要问题

  • set /a是专门用于数值运算的命令,不能直接用来捕获MediaInfo的命令输出,得用for /f来抓取命令执行结果
  • CMD的for循环里直接用%变量名%只会读取循环开始前的变量值,必须开启延迟扩展才能实时获取循环内的变量更新
  • 计算时长和大小时,变量引用方式错误,会导致数值计算逻辑失效

修复后的完整脚本

@echo off
setlocal enabledelayedexpansion
cls

:: 清理旧的临时文件和结果文件
if exist mediafiles.txt del mediafiles.txt
if exist mediafiles.csv del mediafiles.csv

:: 生成当前目录及子目录下的所有文件列表
:: 若只想抓取特定格式媒体文件,可修改为:dir /s/b *.mp4 *.mov *.avi等
dir /s/b . > mediafiles.txt

:: 遍历每个文件路径
for /F "tokens=*" %%i in (mediafiles.txt) do (
    :: 用for /f捕获MediaInfo输出的毫秒级时长
    for /f "delims=" %%d in ('mediainfo --Inform="Video;%%Duration%%" "%%i"') do set "dur=%%d"
    
    :: 过滤非媒体文件(避免空时长导致的计算错误)
    if not "!dur!"=="" (
        :: 转换时长为分钟(毫秒转秒再转分钟,取整数部分)
        set /a mins=(!dur! / 1000) / 60
        
        :: 获取文件字节大小并转换为MB单位
        set "size=%%~zi"
        set /a MB=(!size! / 1024) / 1024
        
        :: 写入CSV文件,给文件名加双引号避免逗号分割混乱
        echo "%%i",!mins!,!MB! >> mediafiles.csv
    )
)

endlocal
@echo on

关键修复细节说明

  1. 开启延迟扩展:脚本开头加入setlocal enabledelayedexpansion,循环内用!变量名!替代%变量名%,确保能获取循环中实时更新的变量值
  2. 正确捕获MediaInfo输出:用for /f "delims=" %%d in ('mediainfo ...')命令抓取工具的执行结果,正确赋值给dur变量
  3. 非媒体文件过滤:增加if not "!dur!"==""判断,跳过无法识别的非媒体文件,避免后续计算报错
  4. CSV格式优化:给文件名添加双引号,防止文件名包含逗号时破坏CSV的列结构

这样修改后,脚本就能正常提取媒体文件的路径、分钟级时长和MB级大小,并写入到CSV文件中了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:40:47