【问题标题】:BATCH | echo multiple variables to file批次 |将多个变量回显到文件
【发布时间】:2017-11-12 09:59:12
【问题描述】:

目录包含 2 个(或更多)任意名称的视频文件。

video1.mkv
video2.mkv

需要找出每个视频的时长。为此,我们使用MediaInfo

setlocal EnableDelayedExpansion

for %%a in (*.mkv) do (
  for /f "usebackq" %%a in (`"mediainfo --Inform=Video;%%Duration%% %%a"`) do set duration=%%a

  echo "!duration!" > "data.txt"
)

问题是,它只打印 1 个值/持续时间(我认为是最后一个文件)。它有效,只为一个文件购买。

如何使它适用于目录中存在的所有文件?

【问题讨论】:

    标签: windows batch-file windows-10 command-line-interface mediainfo


    【解决方案1】:

    只需使用>> 而不是>,后者是追加而不是覆盖

    setlocal EnableDelayedExpansion
    
    for %%a in (*.mkv) do (
      for /f "usebackq" %%a in (`"mediainfo --Inform=Video;%%Duration%% %%a"`) do set duration=%%a
    
      echo "!duration!" >> "data.txt"
    )
    

    【讨论】:

    • 它现在打印两个值,但它们都是第一个或最后一个文件的一个相同变量值的副本(总共两个文件)。
    • 好吧,也许最好不要尝试在两个for 循环中使用%%a 作为元变量。例如,如果您要使用%%a%%b,您可以使用echo %%a %%b>>"filename"
    • 但是 %%a 是一个文件名,我需要回显持续时间吗?我将第二个 for 替换为 %%b 但没有变化。
    • for /f "usebackq" %%b in ("mediainfo --Inform=Video;%%Duration%% %%a") do echo %%a %%b>>"filename" %%a 是文件名,%%b 是由mediainfo 返回的持续时间 -所以不需要对duration进行中间赋值。
    • 如果你想在追加之前创建一个空文件,你必须先创建一个空文件
    【解决方案2】:

    如果 mediainfo.exe 位于路径中的某个位置,则不需要引用此名称,但由于 .mkv 文件名很可能包含空格,请按如下方式更改引用:

    @Echo off&SetLocal EnableExtensions EnableDelayedExpansion
    ( For %%a in (*.mkv) do (
        Set "Duration="
        For /f "delims=" %%b in (
          'mediainfo --Inform^=Video^;%%Duration%% "%%a"'
        ) do set "Duration=%%b"
        echo !Duration!,"%%a"
      )
    ) > "data.txt"
    

    在不知道它属于哪个文件的情况下确定持续时间并没有多大用处,因此这个使用 *.mpg 文件运行的示例会附加文件名。

    2595000,"R:\video\Der Traum ihres Lebens - Das Erste 2010-07-09 20-15-00.mpg"
    5333160,"R:\video\Dirty Harry 3 - Der Unerbittliche - RTL2 2010-05-29 00-10-00.mpg"
    5651960,"R:\video\Die Spur des Falken - Das Erste 2010-05-28 00-40-00.mpg"
    

    【讨论】:

      【解决方案3】:

      只要 MediaInfo 在 %Path% 中,我一直这样做的方式是使用临时文本文件。

      for %%a in (*.mkv) do set mkv=%%a&& call :one
      
      goto eof
      
      :one
      mediainfo "--Inform=General;%%Duration%%" "%mkv%" >> filetemp.txt
      
      set /p dur= < filetemp.txt
      
      echo %dur%
      pause
      del filetemp.txt
      :eof
      

      我使用它的一个变体来使用 ffmpeg 对我的电视节目进行编码,使用 MediaInfo 来获取我在一周内录制的 1-15 个节目的持续时间、帧速率和帧高度。

      【讨论】:

        猜你喜欢
        • 2015-03-26
        • 2016-04-08
        • 2020-09-29
        • 2018-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多