You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:编写DOS批处理将8个声卡名称导出至文本文件

求助:编写DOS批处理将8个声卡名称导出至文本文件

我来帮你一步步解决这个问题,先把你疑惑的点解释清楚,再给你能正常导出所有8个声卡的批处理代码。

先解答你搞不懂的符号问题

  • 2^>^&1:DOS里的标准输出(stdout)标记是1,标准错误(stderr)标记是2。ffmpeg的设备列表信息是输出到 stderr 流里的,而你用的>>默认只捕获 stdout 的内容,所以直接重定向抓不到设备列表。2>&1的作用就是把 stderr 的内容“转接到” stdout 里,这样后面的管道或者重定向就能捕获到这些信息了。加^是因为在for /f的单引号命令块里,这些特殊符号需要转义,不然批处理会解析出错。
  • | findstr /c:"audio":|是管道符号,不是“或”的意思,它的作用是把前一个命令的输出,作为后一个命令的输入。这里就是把ffmpeg输出的所有内容,传给findstr命令;/c:"audio"是让findstr只保留包含“audio”的行,这样就能过滤掉视频设备、日志信息等无关内容,只留下音频设备的相关行。

为什么你之前的命令没生效?

  1. 直接用ffmpeg -list_devices true -f dshow -i dummy>>SoundCardName%batnum%.txt不行,核心原因是设备列表在 stderr 流,>>默认抓不到,得加上2>&1才能把内容导入文件:

    ffmpeg -list_devices true -f dshow -i dummy 2>&1 >>SoundCardName%batnum%.txt
    

    不过这样会把所有输出(包括无关日志)都写入文件,不够干净。

  2. 你写的for循环只导出第一个声卡,是因为加了if not defined AudioDevice的判断——这个判断只会在第一次循环时生效,设置变量并输出,后面的循环因为AudioDevice已经定义了,就跳过了输出步骤,自然只能拿到第一个设备。

能导出所有8个声卡的批处理代码

下面是调整后的代码,能精准抓取所有音频输入设备的名称并写入文件:

@echo off
:: 这里可以根据你的需求设置batnum的值,比如从外部传入或者手动定义
set "batnum=1"
:: 先删除旧的输出文件,避免重复追加内容
del "SoundCardName%batnum%.txt" 2>nul
:: 循环抓取所有音频设备名称
for /f tokens^=2delims^=^" %%a in (
    'ffmpeg -list_devices true -f dshow -i dummy 2^>^&1 ^| findstr /c:"audio input"'
) do (
    :: 把每个声卡名称写入文件
    echo %%~a>>"SoundCardName%batnum%.txt"
)

代码说明

  • @echo off:关闭命令回显,让命令行窗口只显示必要的输出
  • del ... 2>nul:删除旧文件,如果文件不存在就屏蔽错误提示
  • tokens^=2delims^=^":ffmpeg输出的音频设备行格式类似[dshow @ 00000xxxxxx] "我的声卡" (audio input),用双引号作为分隔符,取第二个分段就是声卡的名称
  • findstr /c:"audio input":精准筛选音频输入设备的行,避免误抓其他音频相关的系统行

运行这个批处理后,SoundCardName%batnum%.txt里就会列出你所有8个声卡的准确名称了。

备注:内容来源于stack exchange,提问作者degarb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 10:12:48