使用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
关键修复细节说明
- 开启延迟扩展:脚本开头加入
setlocal enabledelayedexpansion,循环内用!变量名!替代%变量名%,确保能获取循环中实时更新的变量值 - 正确捕获MediaInfo输出:用
for /f "delims=" %%d in ('mediainfo ...')命令抓取工具的执行结果,正确赋值给dur变量 - 非媒体文件过滤:增加
if not "!dur!"==""判断,跳过无法识别的非媒体文件,避免后续计算报错 - CSV格式优化:给文件名添加双引号,防止文件名包含逗号时破坏CSV的列结构
这样修改后,脚本就能正常提取媒体文件的路径、分钟级时长和MB级大小,并写入到CSV文件中了。
内容的提问来源于stack exchange,提问作者nightcrawler
相关产品推荐
相关产品推荐

