通过执行批处理文件/PowerShell脚本设置播放设备

24

我将我的电脑(Windows 7)连接到了电视上,我经常在数字音频(S/PDIF)(高清晰度音频设备)和我的耳机(2-科赛尔CA-HS1 USB耳机)之间切换声音输出设备。

我想执行一个批处理/脚本文件来为我更改此设置,以便我不必“右键单击音量>播放设备>标记输出设备”并单击“设置默认值”。

我知道这是奢侈的问题,但也许我可以从别人那里学到一些东西呢?

非常感谢任何帮助!


我相当确定这可以通过WMI完成,因此在PowerShell中应该很容易。到目前为止,我只找到了 Win32_SoundDevice,但它并没有在这方面提供任何帮助。 - Joey
是的,这大概是我上次研究时所了解到的内容。我一直在思考是否有一种软件可以记录命令,例如当您单击“开始菜单”中的“所有程序”时执行的命令... 那真的会非常有用... - haakonlu
8个回答

25

这是我如何将“Line 1”设置为播放设备的方法:

start /min "" G:\......\nircmd.exe setdefaultsounddevice "Line 1"

NirCmd是一个小型的命令行实用程序,可以下载使用,允许您执行一些有用的任务而不显示任何用户界面。


1
这正是我正在寻找的! 如此简单。 谢谢! - Slowfib
2
太好了! NirCmd似乎比AutoHotKey的UI自动化更强大。 我不得不重命名我的一个播放设备,因为两个设备都叫“扬声器”。 - Carl Walsh
1
非常适用于我的Sony蓝牙耳机:nircmd.exe setdefaultsounddevice“Headphones” - Bill Hoag
1
对我来说运行得非常完美。不确定为什么这不是被接受的答案。 - Ethan Waldeck

10

我有和你一模一样的需求,在看到你的帖子后,我找到了以下内容:

https://web.archive.org/web/20131231034118/http://downloadsquad.switched.com/2010/06/16/windows-7-tip-how-to-change-the-default-audio-device-with-a-hot/

不幸的是,它不是Windows本地功能;它需要下载一个名为AutoHotKey的小型开源脚本工具,但它运行得很好,只需要少量内存(1〜2.5Mb)。
原始文章中提供的脚本对我不起作用。它正在搜索启用/禁用设备并更改该值,而不是更改默认设备。我已经编辑过了,现在可以在两个默认设备之间切换。它的工作方式是打开您的声音控制面板(mmsys.cpl),然后向下滚动播放设备列表以查找列表中的第二项(即{下降2}部分)。这是因为我的扬声器是列表中的第二项。然后它检查设备是否为默认设置。如果不是,则将其设置为默认值并关闭窗口。如果已经是默认设置,则再向下滚动2次并将其设置为默认设置。
因此,您需要修改{Down 2}行以适应您自己的设备列表。
 #+a::
Run, mmsys.cpl
WinWait,Sound
ControlSend,SysListView321,{Down 2}
ControlGet, selectedDevice, List, Focused, SysListView321
Loop, Parse, selectedDevice, %A_Tab%
    if a_index <> 3
        continue
    else 
    {
        if A_LoopField <> Default Device
        {
            ControlClick,&Set Default
            ControlClick,OK
            WinWaitClose
            SoundPlay, *-1
            return
        }
        else
        {
            ControlSend,SysListView321,{Down 2}
            ControlClick,&Set Default
            ControlClick,OK
            WinWaitClose
            SoundPlay, *-1
            return
    }       
}

FYI 我发现安装 AutoHotKey 后,我开始在一些使用 PunkBuster 反作弊系统的在线游戏中断开连接。我认为 PB 检测到了 AutoHotKey 的使用,并决定这是一种利用漏洞的途径。这可能是巧合,或者是一个已经修复的误报,所以效果可能有所不同。 - Hoppertron
这对我非常有效,但是声音窗口中的“设置默认”按钮将设置您的默认声音设备以及默认通信设备。如果您想保留默认通信设备,请将“ControlClick,&Set Default”替换为“Send {tab} {tab} {down} {down} {enter}”。这将切换到“设置默认”按钮,打开下拉菜单,选择默认设备并按Enter键,保持通信设备不变。 - Will Tice

3
我有一个HDMI设备,它的名称一直在变化,所以现有的解决方案都对我无效。
最终,我使用了这个PowerShell和NirCmd应用程序。
#File: TV.ps1
$name = "SMART*"

# list active audio playback devices.   (Note for cature devices change Render to Capture)
$device = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\*\" | where {$_."DeviceState" -eq 1} | foreach-object -Process {(Get-ItemPropertyValue -Path ($_.PSPath + "\Properties\") -Name "{a45c254e-df1c-4efd-8020-67d146a850e0},2")} | Where-Object {$_ -like $name}

C:\bin\NIRCMDC setdefaultsounddevice $device 1
C:\bin\NIRCMDC setdefaultsounddevice $device 2

3

为了跟进Dale Newton的帖子,NirCmd是一个很好的方法来实现这个功能。此外,如果你将其与AutoHotKey配对使用,你可以创建一个可执行文件,在每次运行时更改设备而不打开烦人的CMD窗口。例如,我有两个常常切换的源,一个是我的耳机,另一个是我的显示器。对于我的显示器,我创建了一个ahk脚本来实现这一点:

#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir% ;I have nircmd in the same folder as these scripts
Run, nircmd setdefaultsounddevice "Acer X34-8" 1
Run, nircmd setdefaultsounddevice "Acer X34-8" 2

还有一个用于我的耳机,最后两行更改为:

Run, nircmd setdefaultsounddevice "Headset Earphone" 1
Run, nircmd setdefaultsounddevice "Headset Earphone" 2

之后,您可以将每个ahk脚本编译为exe,并将每个exe绑定到键盘宏,以便您可以使用几个按键来执行它们。个人而言,我使用的是Corsair K95,因此我使用他们的软件将这些绑定到我的“G”键。
另外需要注意的是,如果您在声音首选项中,可以将任何设备重命名以避免命名冲突。

2
以下脚本是在Windows 7中编写的,使用sendkeys。它基于我找到的其他片段,但添加了一些内容,以确保选择是一致的,并且不会显示杂散的窗口。
如果仍然出现问题,您可能需要调整SleepTime以适应您的系统。使用播放设备窗口中要选择的项目的索引作为第一个参数调用脚本。
您可以在“任务栏”上创建一个新的“工具栏”,以单击选择每个设备:
任务栏工具栏图片
'===============================================================================
'This script uses sendkeys to select the Sound Output device
'First parameter should be the desired device number in 'Playback Devices' list
'===============================================================================
Option Explicit

Const SleepTime = 200

Dim WindSh

'===============================================================================
'MAIN ROTUINE
'===============================================================================
'Check the command line input
if ( Wscript.Arguments.Count <> 1)  then
  MsgBox "You must provide a single integer argument representing the device number", vbinformation + vbokonly, Wscript.ScriptName
  Wscript.Quit 1
elseif ( false = IsNumeric( Wscript.Arguments.Item(0) ) )  then
  MsgBox "The argument provided was not an integer number: " & Wscript.Arguments.Item(0), vbinformation + vbokonly, Wscript.ScriptName
  Wscript.Quit 2
End If

set WindSh = CreateObject("Wscript.Shell")
WindSh.run("control.exe mmsys.cpl")
do while (WindSh.AppActivate("Sound") = false)
  WScript.Sleep SleepTime
loop
WindSh.sendkeys("{DOWN " & Clng( Wscript.Arguments.Item(0) ) & "}")
WScript.Sleep SleepTime
WindSh.sendkeys("{TAB 2}")
WScript.Sleep SleepTime
WindSh.sendkeys("{ENTER}")
WScript.Sleep SleepTime
WindSh.sendkeys("%{F4}")
WScript.Sleep SleepTime
if (WindSh.AppActivate("Sound") = true) then
  WindSh.sendkeys("%{F4}")
end if

你可以在System32\DDORes.dll中找到系统设备图标:https://www.digitalcitizen.life/where-find-most-windows-10s-native-icons - Jxtps
如果您的音频输出不可配置,则需要将“{TAB 2}”更改为“{TAB 1}”。如果其中一些是可配置的,而其他一些则不是,则需要添加另一个命令行参数,并模仿“{DOWN“...”部分所做的操作。 - Jxtps
将脚本保存到以.vbs结尾的文件中,例如sound.vbs,将其放在一个目录中,然后创建一个Toolbar子目录,在其中放置带有额外参数的快捷方式(编辑快捷方式属性以设置参数和更改图标),然后右键单击任务栏->工具栏->新工具栏,导航到您的新工具栏子目录,这将创建新的工具栏。然后右键单击它以不显示文本或标题,完成! - Jxtps

2
据我所知,无法通过程序实现此功能。这是一种有意的设计,因为微软不希望应用程序覆盖用户设置的音频设置。
你会在这里找到相同的答案,但如果你想要操纵窗口的解决方案,可以看看这里

我的回答中包含了关于你的CodePlex项目操作Windows的代码。 - JPBlanc

0
请注意,如果您在企业或教育环境的登录脚本中使用nircmd setdefaultsounddevice speakers,当耳机插入时声音仍将从扬声器中输出。

0

可能与通过脚本切换音频设备无关,但我也通过HDMI将电脑连接到电视上。

当我想在电视上观看视频文件时,我使用Media Player Classic Home Cinema - 这使我可以在选项中为MPH:HC指定音频设备,而无需在整个计算机上切换默认声音设备。

如果您的用法类似于我的,也许MPC:HC可以为您解决问题。


是的,我已经在使用Winamp和VLC了,但是我同样经常使用电视和音响系统而不是我的电脑屏幕和耳机。 :p - haakonlu

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