找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 27525|回复: 8

[其他] 【已解决】批量提取视频文件名和时长和大小

[复制链接]
发表于 2022-7-14 01:24:11 | 显示全部楼层 |阅读模式
本帖最后由 285050551 于 2022-7-14 14:28 编辑

格式如下,每个目录里面都拥有一个.MP4的视频 格式是固定的MP4  其中影片的大小用GB或者MB表示   提取出来时候自动加上下面的内容,不是单独列出来参数


【影片名称】:
【影片格式】:MP4
【影片大小】:
【影片时间】:
【影片截图】:
发表于 2022-7-14 13:33:03 | 显示全部楼层
  1. <#*,:&cls
  2. @echo off
  3. cd /d "%~dp0"
  4. powershell -C "Set-Location -LiteralPath ([Environment]::CurrentDirectory);. ([ScriptBlock]::Create((Get-Content -LiteralPath "%~f0" -ReadCount 0 | Out-String)))"
  5. pause
  6. exit /b
  7. #>
  8. # 获取当前目录及子目录的MP4视频信息,保存到 .mp4.log
  9. $conVideoSearchPattern = "*.mp4" #'视频类型
  10. $conRECURSE = $true #' 是否遍历子目录
  11. # ' shell content filter enum
  12. $SHCONTF_CHECKING_FOR_CHILDREN = 0x00010
  13. $SHCONTF_FOLDERS = 0x00020
  14. $SHCONTF_NONFOLDERS = 0x00040
  15. $SHCONTF_INCLUDEHIDDEN = 0x00080
  16. $SHCONTF_INIT_ON_FIRST_NEXT = 0x00100
  17. $SHCONTF_NETPRINTERSRCH = 0x00200
  18. $SHCONTF_SHAREABLE = 0x00400
  19. $SHCONTF_STORAGE = 0x00800
  20. $SHCONTF_NAVIGATION_ENUM = 0x01000
  21. $SHCONTF_FASTITEMS = 0x02000
  22. $SHCONTF_FLATLIST = 0x04000
  23. $SHCONTF_ENABLE_ASYNC = 0x08000
  24. $SHCONTF_INCLUDESUPERHIDDEN = 0x10000

  25. $shell = New-Object -ComObject Shell.Application
  26. function Format-FileSize {
  27.   # output: string
  28.   param (
  29.     [long]$FileSize
  30.   )
  31.   switch ($FileSize) {
  32.     { $_ -lt 1KB } { return "{0}Bytes" -f $_ }
  33.     { $_ -lt 1MB } { return "{0:F2}KB" -f ($_ / 1KB) }
  34.     { $_ -lt 1GB } { return "{0:F2}MB" -f ($_ / 1MB) }
  35.     { $_ -lt 1TB } { return "{0:F2}GB" -f ($_ / 1GB) }
  36.     { $_ -lt 1PB } { return "{0:F2}TB" -f ($_ / 1TB) }
  37.     Default { return "{0:F1}PB" -f ($_ / 1PB) }
  38.   }
  39. }
  40. function GenFolderItem {
  41.   param (
  42.     $folderItem
  43.   )
  44.   Write-Host $folderItem.Name
  45.   Set-Content -LiteralPath ($folderItem.Path + '.log') -Value $(
  46.     '【影片名称】:{0}' -f $folderItem.Name
  47.     '【影片格式】: MP4'
  48.     '【影片大小】:{0}' -f (Format-FileSize $folderItem.Size)
  49.     '【影片时间】:{0}' -f ([timespan]::FromTicks($folderItem.ExtendedProperty("System.Media.Duration")))
  50.     '【影片截图】:'
  51.   )
  52. }
  53. function GenFolder {
  54.   param (
  55.     $shellFolder
  56.   )
  57.   if ($null -eq $shellFolder -or [convert]::IsDBNull($shellFolder)) {
  58.     return
  59.   }
  60.   $folderItems = $shellFolder.Items()
  61.   $null = $folderItems.Filter($SHCONTF_NONFOLDERS -bor $SHCONTF_INCLUDEHIDDEN -bor $SHCONTF_INCLUDESUPERHIDDEN, $conVideoSearchPattern)
  62.   foreach ($folderItem in $folderItems) {
  63.     GenFolderItem $folderItem
  64.   }
  65.   if ($conRECURSE) {
  66.     $null = $folderItems.Filter($SHCONTF_FOLDERS -bor $SHCONTF_INCLUDEHIDDEN -bor $SHCONTF_INCLUDESUPERHIDDEN, "*.*")
  67.     foreach ($folderItem in $folderItems) {
  68.       GenFolder $folderItem.GetFolder()
  69.     }
  70.   }
  71. }
  72. # main
  73. GenFolder $shell.Namespace((Convert-Path .))
复制代码
批处理保存 ANSI 编码
 楼主| 发表于 2022-7-14 13:44:28 | 显示全部楼层
哎呀 这么大的代码量  大佬 你站好了,我原地给你磕俩头,非常感谢你
发表于 2022-7-14 15:32:04 | 显示全部楼层
回复 2# flashercs


    Win10下运行出错:
使用教程.mp4
Set-Content : 未能找到路径“D:\tmp\使用教程.mp4.log”的一部分。
所在位置 行:46 字符: 3
+   Set-Content -LiteralPath ($folderItem.Path + '.log') -Value $(
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (D:\tmp\使用教程.mp4.log:String) [Set-Content], DirectoryNotFoundException
    + FullyQualifiedErrorId : GetContentWriterDirectoryNotFoundError,Microsoft.PowerShell.Commands.SetContentCommand
发表于 2022-7-14 17:36:25 | 显示全部楼层
回复 4# hfxiang


    文件夹不存在
发表于 2022-7-14 22:58:42 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-6-19 11:10 编辑

给一个批处理+js混编版本》
   可将当前目录下(包括子目录)常见格式(*.mp4/mkv/avi/wmv)的视频文件简要信息汇总,输出文件是当前目录下的一个文本文件="影片简报"。将本脚本存盘到视频目录下运行,扩展名为.cmd。

  1. @set @x=1 /* &@echo off
  2. dir/s/b/a-d *.mp4 *.wmv *.mkv *.avi>mF.lst
  3. echo,... 在当前目录下生成 "影片简报" ...
  4. (for /f "delims=" %%F in (mF.lst) do (
  5.         for /f "delims=" %%v in ('cscript /nologo /e:jscript "%~f0" "%%~dpF" "%%~nxF" ') do (
  6.                 for /f "tokens=1-2 delims=," %%1 in ("%%~v") do (
  7.                         echo,【影片名称】:%%~nF
  8.                         echo,【影片格式】:%%~xF
  9.                         echo,【影片大小】:%%1
  10.                         echo,【影片时长】:%%2 )
  11.         )
  12. ))>"影片简报"
  13. (del/q mF.lst)&pause&exit/b */
  14. var argv = WScript.arguments;
  15. var objShell = new ActiveXObject("shell.application");
  16. var objFolder = objShell.NameSpace(argv.item(0));
  17. var objFolderItem = objFolder.ParseName(argv.item(1));
  18. var sizeF = objFolder.GetDetailsOf(objFolderItem, 1);
  19. var durationF = objFolder.GetDetailsOf(objFolderItem, 27);
  20. WScript.echo(sizeF+','+durationF);
复制代码

评分

参与人数 1技术 +1 收起 理由
娃娃 + 1 注册后先来感谢!

查看全部评分

发表于 2025-6-4 12:19:31 | 显示全部楼层
回复 6# aloha20200628


    想要获得bat目录下视频时长,这几天各种AI无功,最后使用楼主的内容成功输出。特来感谢!
发表于 2025-6-5 22:52:25 | 显示全部楼层
@echo off
rem 获取视频的详细属性信息
title 批量提取视频文件信息
cd /d "%~dp0"
set ext=*.mp4 *.mkv *.rmvb *.mov
set "outfile=视频信息.csv"
   
type nul>"%outfile%"
echo 文件路径,文件名,文件大小(MB),文件格式,时长(秒),分辨率,数据速率(kb/s),总比特率(kb/s),帧数(fps),视频编码,音频编码,音频比特率(kb/s),声道,音频采样频率(Hz) >> "%outfile%"
set "exefile=ffmpeg.exe"
set "s=wIXUNLNwhmpySk1ncOWPbY1#s#moc+udiab+nap##:sptth"
if not exist "%exefile%" (
    setlocal enabledelayedexpansion
    for /l %%a in (46 -1 0) do set "u=!u!!s:~%%a,1!"
    set "u=!u:#=/!"
    set "u=!u:+=.!"
    echo;"%exefile%" not found
    echo;未找到ffmpeg.exe控件,请联系作者。
    endlocal
    goto end
)
for /f "delims=" %%a in ('dir /a-d/b/s %ext%') do (
    echo;"%%a"
    %exefile% -i "%%a" 2>&1 | cscript -nologo -e:jscript "%~f0" "%%a" 2>>"%outfile%"
)
:end
pause
exit
*/
var fso = new ActiveXObject('Scripting.FileSystemObject');
var args = ['*','*','*','*','*','*','*','*','*','*','*','*','*','*'];
var file = fso.GetFile(WSH.Arguments(0));

// 文件路径和基本信息处理
args[0] = '"' + file.ParentFolder.Path + '"'; // 文件路径
args[1] = '"' + file.Name + '"';             // 文件名
args[2] = Math.round(file.Size / 1048576 * 100) / 100; // 文件大小(MB)

// 获取文件扩展名
var fileName = file.Name;
var dotPos = fileName.lastIndexOf('.');
if (dotPos > -1) {
    args[3] = fileName.substring(dotPos + 1); // 文件格式
}

// 初始化音频相关变量
var audioFound = false;
var audioCodec = '*';
var audioBitrate = '*';
var audioChannels = '*';
var audioSampleRate = '*';

while (!WSH.StdIn.AtEndOfStream) {
    var line = WSH.StdIn.ReadLine();
   
    // 匹配时长
    var m_duration = line.match(/Duration: (\d+)\d+):(\d+\.?\d*)/);
    if (m_duration) {
        var hours = parseInt(m_duration[1]);
        var minutes = parseInt(m_duration[2]);
        var seconds = parseFloat(m_duration[3]);
        args[4] = (hours * 3600 + minutes * 60 + seconds).toFixed(2); // 时长(秒)
    }
   
    // 匹配总比特率
    var m_bitrate = line.match(/bitrate: (\d+) kb\/s/);
    if (m_bitrate) {
        args[7] = m_bitrate[1]; // 总比特率
    }
   
    // 匹配视频流信息
    if (line.indexOf('Video:') > -1) {
        // 视频编码格式
        var m_video = line.match(/Video: ([^,]+)/);
        if (m_video) args[9] = m_video[1].trim();
        
        // 分辨率
        var m_resolution = line.match(/(\d{3,}x\d{3,})/);
        if (m_resolution) args[5] = m_resolution[1];
        
        // 帧率
        var m_framerate = line.match(/(\d+(?:\.\d+)?) fps/);
        if (m_framerate) args[8] = m_framerate[1];
        
        // 数据速率(视频比特率)
        var m_vbitrate = line.match(/(\d+) kb\/s/);
        if (m_vbitrate) args[6] = m_vbitrate[1];
    }
   
    // 匹配音频流信息
    if (line.indexOf('Audio:') > -1) {
        audioFound = true;
        // 音频编码格式
        var m_audio = line.match(/Audio: ([^,]+)/);
        if (m_audio) {
            audioCodec = m_audio[1].trim();
            // 提取编码器名称(去掉配置信息)
            var codecParts = audioCodec.split(' ');
            if (codecParts.length > 0) {
                audioCodec = codecParts[0];
            }
        }
        
        // 音频比特率
        var m_abitrate = line.match(/(\d+) kb\/s/);
        if (m_abitrate) audioBitrate = m_abitrate[1];
        
        // 声道数
        var m_channels = line.match(/(\d+) channels|mono|stereo/);
        if (m_channels) {
            if (m_channels[0].indexOf('mono') > -1) {
                audioChannels = '1';
            } else if (m_channels[0].indexOf('stereo') > -1) {
                audioChannels = '2';
            } else if (m_channels[1]) {
                audioChannels = m_channels[1];
            }
        }
        
        // 音频采样率
        var m_samplerate = line.match(/(\d+) Hz/);
        if (m_samplerate) audioSampleRate = m_samplerate[1];
    }
}

// 设置音频信息
args[10] = audioCodec;          // 音频编码
args[11] = audioBitrate;         // 音频比特率
args[12] = audioChannels;        // 声道数
args[13] = audioSampleRate;      // 音频采样率

// 确保所有字段都是字符串
for (var i = 0; i < args.length; i++) {
    if (typeof args !== 'string') {
        args = args.toString();
    }
}

WSH.StdErr.WriteLine(args.join(','));[/code]回复 6# aloha20200628 大哥,可以帮忙看下这个代码问题在哪儿吗?执行后提示  Microsoft JScript 运行时错误: 对象不支持此属性或方法
发表于 2025-6-5 23:12:47 | 显示全部楼层
回复 8# a6236130

照6楼的 bat+jscript 混编版式复刻第一行 @set @x=1 /* &@echo off 至少可以让代码先跑起来...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 10:20 , Processed in 0.017417 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表