仅使用 DOS 命令(Windows / .bat)即可查找目录中所有视频(.avi、.flv、.mkv、.mov、.mp4、.swf、.webm 等)的总时间,并

仅使用 DOS 命令(Windows / .bat)即可查找目录中所有视频(.avi、.flv、.mkv、.mov、.mp4、.swf、.webm 等)的总时间,并

我想要一个.bat 文件,它可以找出一个目录中所有视频(.avi、.flv、.mkv、.mov、.mp4、.swf、.webm 等)的总时间,不需要其他任何附加功能。

我只想使用 DOS 命令(Windows / .bat),必要时还想使用 ffmpeg / ffprobe。(我完全不懂 Unix/Linux 或它们的命令)我不想使用 PowerShell,只想使用纯 DOS 命令。

使用的语法必须适用于 .bat 文件而不是命令行。

此外,能够找到一组曲目的总时间也很有趣。

\directory 1 > total time 1
\directory 2 > total time 2

我搜索并发现以下内容,但它并没有提供我想要的内容:


#1 – 在线 DOS 命令

for %i in ("*.mp4") do ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "%i" -sexagesimal

但它没有给出总时间。它给出了目录中每个文件的时间。


#2 – DOS 批处理文件(.bat)

  @echo off

˃ output.txt(

      for %%F in (*.mpg *.mp4 *.mkv *.avi *.m4a *.flac *.mp3 *.wav) do (

          for /f "tokens=2 delims==" %%a in (

              'ffprobe "%%F" -show_entries format^=duration -sexagesimal -v quiet -of compact'

          ) do (

              echo %%~nxF^|%%a seconds

          )

      )

  )

  pause

结果位于 output.txt 文件中并针对每个文件。

答案1

我认为这就是你的目标。不过有一些注意事项。

  1. 任何包含“&”符号的文件名在处理时都会导致批量出错。
  2. 输出以秒为单位从计算中删去了毫秒数。
  3. 这是针对单个目录的。需要扩展批处理才能遍历目录树。
  4. 我使用的是call与 DelayedExpansion 配对的批处理文件函数方法goto :EOF。我个人觉得它更容易读写。
  5. 此批处理应ffmpeg位于您的路径中,并且您当前的目录应是您正在查询的目录。我将其拉出pushd D:\stupid_cat_videospopd然后才发布。

注意:
您的 ffmpeg 命令将时间拼接成 HH:MM:SS:MS。我删除了该sexagesimal参数以将其保留为秒数。事后您可以随时将其转换回 HH:MM:SS。

我希望这就是您所寻找的,或者能帮助您更接近奖品。


    @echo off

    SetLocal

    Set TotalSeconds=0
    Set TotalFiles=0

    for %%F in (*.mpg *.mp4 *.mkv *.avi *.m4a *.flac *.mp3 *.wav) do call :CountLensOnFile "%%F"

    echo -----------------------------------------
    echo %TotalFiles% files processed.
    echo Total time is %TotalSeconds% seconds.
    echo -----------------------------------------

    goto :EOF

    EndLocal

    :: -----------------------------------------------------
    :CountLensOnFile
    :: Calls ffprobe to calculate file time for input param 1
    :: -----------------------------------------------------
    Set InputFile=%~1
    echo Calculating file time for %InputFile%
    for /f "tokens=2 delims==" %%a in ( 'ffprobe "%InputFile%" -show_entries format^=duration -v quiet -of compact' ) do call :SplitCalcFileTime "%%a"
    Set /a TotalFiles=%TotalFiles% +1
    goto :EOF

    :: -----------------------------------------------------
    :SplitCalcFileTime
    :: Calls for loop to split seconds from miliseconds
    :: -----------------------------------------------------
    Set InputTime=%~1
    for /f "tokens=1 delims=." %%s in ('echo %InputTime%') do call :CalcFileTime "%%s"
    goto :EOF

    :: -----------------------------------------------------
    :CalcFileTime
    :: Calculates total seconds for this run
    :: -----------------------------------------------------
    Set NumSeconds=%~1
    Set /a TotalSeconds = %TotalSeconds% + %NumSeconds%
    goto :EOF


相关内容