【问题标题】:Setting playback device by executing a batch file / powershell script通过执行批处理文件/powershell脚本设置播放设备
【发布时间】:2012-04-07 23:20:29
【问题描述】:

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

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

我知道这是一个奢侈问题,但是,嘿,也许我可以向某人学习一些东西?

感谢所有帮助!

【问题讨论】:

  • 我很确定这可以通过 WMI 完成,因此在 PowerShell 中应该是微不足道的。不过,到目前为止,我只找到了Win32_SoundDevice,在这方面并没有真正提供任何东西。
  • 是的,这就是我上次研究它的时候走了多远。我一直在想,一定有某种软件可以记录当你点击开始菜单中的“所有程序”时执行的命令..这真的很有用..

标签: audio powershell batch-file powershell-2.0 playback


【解决方案1】:

据我了解,无法以编程方式执行此操作。这是经过深思熟虑的设计,因为 Microsoft 不希望应用程序覆盖用户设置的音频设置。

您会找到相同的答案here,但如果您的解决方案是操作窗口,您可以看看here

【讨论】:

  • 它包含在我的回答中,您的 codeplex 项目操作窗口。
【解决方案2】:

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

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

如果您的用法与我的相似,也许 MPC:HC 会为您解决问题。

【讨论】:

  • 是的,我已经开始使用 Winamp 和 VLC,但我和我的电脑屏幕和耳机一样经常使用电视和扬声器系统.. :p
【解决方案3】:

我的要求和你完全一样,在偶然发现你的帖子后,我发现了以下内容:

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)

原始文章中提供的脚本不适用于我。它正在搜索启用/禁用设备并更改该值,而不是更改默认设备。 我已经对其进行了编辑,现在可以在 2 个默认设备之间切换。 它的工作原理是打开您的声音控制面板 (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
    }       
}

【讨论】:

  • 仅供参考,我发现在安装 AutoHotKey 后,我开始与一些使用 PunkBuster 反作弊系统的在线游戏断开连接。我认为 PB 正在检测 AutoHotKey 的使用,并认为这是漏洞利用的载体。这可能是巧合,也可能是误报已被修复,因此里程可能会有所不同。
  • 这对我很有用,但是声音窗口中的设置默认按钮将设置您的默认声音设备以及您的默认通信设备。如果您想保留默认通信设备,请将ControlClick,&amp;Set Default 替换为Send {tab}{tab}{down}{down}{enter}。这将切换到“设置默认值”按钮,打开下拉菜单,选择“默认设备”,然后按 Enter,保持您的通信设备完好无损。
【解决方案4】:

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

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

NirCmd 是一个小型命令行实用程序,您可以下载它,让您在不显示任何用户界面的情况下执行一些有用的任务。

【讨论】:

  • 这正是我想要的!太简单。谢谢!
  • 完美! NirCmd 似乎比使用 AutoHotKey 的 UI 自动化更强大。我不得不重命名我的一个播放设备,因为它们都被称为“扬声器”
  • 非常适合我的索尼蓝牙耳机:nircmd.exe setdefaultsounddevice "Headphones"
  • 非常适合我。不知道为什么这不是公认的答案。
【解决方案5】:

要跟进Dale Newton's 的帖子,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”键。

还要注意,如果您在声音偏好设置中,可以重命名任何设备以避免命名冲突。

【讨论】:

    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

      以下脚本是在 Windows 7 中编写并使用 sendkeys。它基于我发现的其他 sn-ps,但添加到它们以确保选择一致并且不会显示杂散窗口。 如果系统仍在播放,您可能需要调整睡眠时间。 使用快捷方式调用脚本,将您希望在“播放设备”窗口中选择的项目的索引作为第一个参数。 您可以在“任务栏”上创建一个新的“工具栏”,只需单击一下即可选择每个设备: Taskbar toolbar picture

      '===============================================================================
      '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
      

      【讨论】:

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

      我有一个不断更改名称的 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-30
        • 2018-04-12
        • 2012-12-02
        • 1970-01-01
        • 2017-11-11
        • 2011-09-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多