windows - 如何将命令输出批量设置为变量

标签 windows batch-file ffmpeg command-prompt mediainfo

首先,我用谷歌搜索并搜索了如何解决这个问题,但没有运气。我正在制作一个批处理文件,以将文件中的音频重新编码为 aac,如果它是使用 ffmpeg 的 ac-3 或 ogg。我知道如何使用 ffmpeg 进行转换,只是不知道如何仅在音频与某个编解码器匹配时自动进行转换。要获取文件的音频编解码器,我有两种不同的方法,一种使用 ffprobe,另一种使用 MediaInfo。

MediaInfo --Inform="Audio;%%Format%%" "input.mkv"

或者
ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "input.mkv"

但是,我的问题是从命令输出中设置变量。这是我一直在尝试的代码,但无济于事。
SETLOCAL

for %%a in (*.mp4) do (

MediaInfo --Inform="Audio;%%Format%%" "%%a">codec.txt

SET /p codec=<codec.txt

DEL codec.txt

ECHO %codec%

)

pause

显然,这只是我目标的一部分,但这是我似乎无法超越的部分。我已经通过删除“DEL codec.txt”部分进行了检查,这实际上是将正确的输出存储在文本文件中,但它没有将其导入变量中。无论如何,我可以将输出设置为变量很好,这正是我在搜索中经常发现的方式。

任何帮助深表感谢。

最佳答案

for %%a in (*.mp4) do (
 for /f "delims=" %%c in (
  'MediaInfo --Inform="Audio;%%Format%%" "%%a" ') do (

  echo codec is %%c
  rem now use "%%c" as codec
 )
 rem "%%c" is now out-of-scope
)

您需要在 SO 中搜索 delayed expansion解释为什么codec在您的代码中保持不变。

关于windows - 如何将命令输出批量设置为变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40984815/

相关文章:

visual-studio-2010 - 创建批处理文件以打开 Visual Studio 2010 解决方案

ffmpeg - ffmpeg 5.0 与 ffmpeg 4.1.1 的 Concat 失败

video - FFmpeg:将任何视频转换为边栏模糊的方形 1:1 视频

ruby-on-rails - SSL_connect returned=1 errno=0 state=SSLv3 读取服务器证书 B : certificate verify failed on WINDOWS

c# - 使用通配符递归地从文件夹复制文件(文件夹路径有通配符)

windows - IsFile、IsDirectory 测试窗口

ffmpeg - 使用ffmpeg从m4v文件中提取图片

windows - 是否存在用于禁用第 3 方应用程序中的弹出菜单项的 hack,例如 Visual Studio ?

c - 如何在 Windows 中从内核模式查找进程使用的内存

windows - 从批处理文件启动 .exe 时奇怪的命令提示挂起