批处理 | 将多个变量输出到文件

5

目录中包含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个值/持续时间(我认为是最后一个文件)。它可以工作,但仅适用于一个文件。
如何使其适用于目录中的所有文件?
3个回答

3

只需使用>>代替>,它会添加而不是覆盖。

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"
)

现在它打印出两个值,但它们都是第一个或最后一个文件(总共两个文件)中同一个变量值的副本。 - user3108268
1
也许不要尝试在两个“for”循环中都使用“%%a”作为元变量可能是一个好主意。例如,如果您使用“%%a”和“%%b”,您可以使用“echo %%a %%b>>“filename”” - Magoo
但是%%a是一个文件名,我需要回显持续时间?我将第二个for替换为%%b,但没有变化。 - user3108268
1
对于文件夹中的每个文件,使用mediainfo命令获取视频时长,并将文件名和时长写入filename文件中。代码如下:for /f "usebackq" %%b in ("mediainfo --Inform=Video;%%Duration%% %%a") do echo %%a %%b>>"filename" 其中,%%a表示文件名,%%b表示mediainfo返回的时长,因此不需要进行中间赋值给duration - Magoo
如果您想在追加之前创建一个空文件,则必须先创建该空文件。 - phuclv

1
如果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"

0
只要 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个节目中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接