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

Audio 通过执行批处理文件/powershell脚本设置播放设备,audio,powershell,batch-file,powershell-2.0,playback,Audio,Powershell,Batch File,Powershell 2.0,Playback,我的电脑(Windows 7)已经连接到电视上,我经常在数字音频(S/PDIF)(高清音频设备)和耳机(2-Corsair CA-HS1 USB耳机)之间更换声音输出设备 我希望能够执行一个批处理/脚本文件,由其为我更改此文件,这样我就不必“右键单击音量>播放设备>标记输出设备”,然后单击“设置默认值” 我知道这是一个奢侈的问题,但嘿,也许我可以从别人那里学到点什么 非常感谢您的帮助!据我所知,无法通过编程实现这一点。这是一个经过深思熟虑的设计,因为Microsoft不希望应用程序覆盖用户设置的

我的电脑(Windows 7)已经连接到电视上,我经常在数字音频(S/PDIF)(高清音频设备)和耳机(2-Corsair CA-HS1 USB耳机)之间更换声音输出设备

我希望能够执行一个批处理/脚本文件,由其为我更改此文件,这样我就不必“右键单击音量>播放设备>标记输出设备”,然后单击“设置默认值”

我知道这是一个奢侈的问题,但嘿,也许我可以从别人那里学到点什么


非常感谢您的帮助!

据我所知,无法通过编程实现这一点。这是一个经过深思熟虑的设计,因为Microsoft不希望应用程序覆盖用户设置的音频设置


你会找到同样的答案,但如果你找到操作windows的解决方案,你可以看看。

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

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


如果您的使用方法与我的类似,那么MPC:HC可能会为您解决问题。

我有与您完全相同的要求,在无意中看到您的帖子后,我发现以下内容:

不幸的是,它不是一个本机Windows功能;它需要下载一个名为AutoHotKey的小型开源脚本工具,但它运行良好,只需要少量内存(1~2.5Mb)

原始文章中提供的脚本不适用于我。它正在搜索启用/禁用的设备并更改该值,而不是更改默认设备。 我现在编辑它在两个默认设备之间切换。 它的工作原理是打开声音控制面板(mmsys.cpl),然后向下滚动播放设备列表到列表中的第二项(即{down 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
    }       
}
#+a::
快跑,mmsys.cpl
等等,好吗
ControlSend,SysListView321,{Down 2}
ControlGet、selectedDevice、List、Focused、SysListView321
循环、分析、选定设备,%A\u选项卡%
如果a_索引为3
持续
其他的
{
如果一个_LoopField是默认设备
{
控制单击并设置默认值(&S)
控制点,好吗
温韦特克洛斯
配乐,*-1
返回
}
其他的
{
ControlSend,SysListView321,{Down 2}
控制单击并设置默认值(&S)
控制点,好吗
温韦特克洛斯
配乐,*-1
返回
}       
}

我就是这样将“第1行”设置为播放设备的:

start /min "" G:\......\nircmd.exe setdefaultsounddevice "Line 1"
是一个小的命令行实用程序,您可以下载它,它允许您在不显示任何用户界面的情况下执行一些有用的任务。

在post上跟进,这是一个很好的方法。除此之外,如果您将它与之配对,您可以创建一个可执行文件,该文件将在每次运行时更改设备,而无需打开烦人的CMD窗口。For例如,我有两个源,我一直在这两个源之间切换,一个是我的耳机,另一个是我的显示器。对于我的显示器,我创建了一个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绑定到一个键盘宏,这样你就可以通过几次按键来执行它们。我个人使用的是海盗K95,所以我使用他们的软件将它们绑定到我的“G”键


还需要注意的是,如果您在您的声音首选项中,您可以重命名任何设备以避免命名冲突。

请注意,如果您在企业或教育环境登录脚本中使用
nircmd setdefaultsounddevice speakers
,则插入耳机后,扬声器仍会发出声音。

以下内容g脚本是在Windows7中编写的,使用sendkeys。它基于我找到的其他代码片段,但添加到它们中以确保选择一致,并且不会留下不可见的窗口。 如果系统仍在播放,您可能需要调整系统的睡眠时间。 使用快捷方式调用脚本,并将要在“播放设备”窗口中选择的项目的索引作为第一个参数。 您可以在“任务栏”上创建一个新的“工具栏”,只需单击即可选择每个设备:

'===============================================================================
'此脚本使用sendkeys选择声音输出设备
'第一个参数应该是'播放设备'列表中所需的设备编号
'===============================================================================
选项显式
常数睡眠时间=200
昏暗的风
'===============================================================================
“主罗图因酒店
'===============================================================================
'检查命令行输入
如果(Wscript.Arguments.Count 1),则
MsgBox“您必须提供一个表示设备编号的整数参数”,vbinformation+vbokonly,Wscript.ScriptName
Wscript.Quit 1
elseif(false=IsNumeric(Wscript.Arguments.Item(0)),然后
MsgBox“提供的参数不是整数:”&Wscript.Arguments.Item(0),vbinformation+vbokonly,Wscript.ScriptName
Wscript.Quit 2
如果结束
设置WindSh=CreateObject(“Wscript.Shell”)
WindSh.run(“control.exe mmsys.cpl”)
do while(WindSh.AppActivate(“声音”)=假)
睡眠时间
环
sendkeys(“{DOWN”&Clng(Wscript.Arguments.Item(0))&“}”)
WScript。
'===============================================================================
'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 arguement representing the device number", vbinformation + vbokonly, Wscript.ScriptName
  Wscript.Quit 1
elseif ( false = IsNumeric( Wscript.Arguments.Item(0) ) )  then
  MsgBox "The arguement 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
#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