求助:编写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”的行,这样就能过滤掉视频设备、日志信息等无关内容,只留下音频设备的相关行。
为什么你之前的命令没生效?
直接用
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不过这样会把所有输出(包括无关日志)都写入文件,不够干净。
你写的
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
相关产品推荐
相关产品推荐

