查看: 123|回复: 1

Windows 11音频设备一键切换:PowerShell+nircmd自动化方案

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在日常使用Windows 11时,经常需要在笔记本内置扬声器与蓝牙耳机之间快速切换音频输入输出设备,比如开会时用耳机,看视频时换回外放。虽然系统托盘可以手动切换,但效率较低,尤其需要同时切换播放和录制设备时更显繁琐。本文介绍一种基于PowerShell脚本配合第三方工具nircmd的自动化方案,实现一键切换并显示通知。

前置准备:安装AudioDeviceCmdlets模块
该模块提供了Get-AudioDevice等命令,用于获取和设置默认音频设备。在PowerShell中执行以下命令安装:
  1. Install-Module -Name AudioDeviceCmdlets
复制代码
安装后,建议先重命名音频设备,便于脚本识别。在系统声音设置中,将常用设备重命名为简洁、无空格的名称,例如“笔记本扬声器”“笔记本麦克风”“迈从V9pro扬声器”“迈从V9pro麦克风”。重命名步骤:右键任务栏音量图标→声音设置→更多声音设置→播放/录制选项卡,选中设备后右键重命名。

验证当前设备名称
运行以下命令获取当前正在使用的播放和录制设备名称:
  1. Get-AudioDevice -Playback | Select-Object -ExpandProperty Name
  2. Get-AudioDevice -Recording | Select-Object -ExpandProperty Name
复制代码
输出结果应与之前重命名的名称一致,确保脚本中的匹配字符串正确。

下载nircmd工具
nircmd是一个轻量级命令行工具,提供setdefaultsounddevice命令切换默认音频设备。从NirSoft官网下载适合系统架构的版本(32位或64位),解压到指定文件夹,例如D:\nircmd。该工具无需安装。

编写切换脚本
在nircmd同目录下创建audio_switch.ps1,内容如下(可根据实际设备名称调整):
  1. [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
  2. [Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
  3. [Windows.UI.Notifications.ToastNotification, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
  4. [Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null
  5. function Show-Notification {
  6. param ([string]$Message)
  7. $AppId = "{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\WindowsPowerShell\v1.0\powershell.exe"
  8. $Template = @"
  9. <toast>
  10. <visual>
  11. <binding template="ToastText01">
  12. <text id="1">$Message</text>
  13. </binding>
  14. </visual>
  15. </toast>
  16. "@
  17. $XmlDoc = New-Object Windows.Data.Xml.Dom.XmlDocument
  18. $XmlDoc.LoadXml($Template)
  19. $Toast = New-Object Windows.UI.Notifications.ToastNotification $XmlDoc
  20. [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($AppId).Show($Toast)
  21. }
  22. $laptopSpeaker = "笔记本扬声器"
  23. $laptopMic = "笔记本麦克风"
  24. $bluetoothSpeaker = "迈从V9pro扬声器"
  25. $bluetoothMic = "迈从V9pro麦克风"
  26. $switchToSpeaker = ""
  27. $switchToMic = ""
  28. $currentPlayback = Get-AudioDevice -Playback | Select-Object -ExpandProperty Name
  29. $currentRecording = Get-AudioDevice -Recording | Select-Object -ExpandProperty Name
  30. if($currentPlayback -like "*笔记本扬声器*") {
  31. nircmd setdefaultsounddevice "$bluetoothSpeaker" 1
  32. nircmd setdefaultsounddevice "$bluetoothSpeaker" 2
  33. nircmd setdefaultsounddevice "$bluetoothSpeaker" 3
  34. $switchToSpeaker=$bluetoothSpeaker
  35. }
  36. elseif($currentPlayback -like "*迈从V9pro扬声器*") {
  37. nircmd setdefaultsounddevice "$laptopSpeaker" 1
  38. nircmd setdefaultsounddevice "$laptopSpeaker" 2
  39. nircmd setdefaultsounddevice "$laptopSpeaker" 3
  40. $switchToSpeaker=$laptopSpeaker
  41. }
  42. if($currentRecording -like "*笔记本麦克风*") {
  43. nircmd setdefaultsounddevice "$bluetoothMic" 1 Recorder
  44. nircmd setdefaultsounddevice "$bluetoothMic" 2 Recorder
  45. nircmd setdefaultsounddevice "$bluetoothMic" 3 Recorder
  46. $switchToMic=$bluetoothMic
  47. }
  48. elseif($currentRecording -like "*迈从V9pro麦克风*") {
  49. nircmd setdefaultsounddevice "$laptopMic" 1 Recorder
  50. nircmd setdefaultsounddevice "$laptopMic" 2 Recorder
  51. nircmd setdefaultsounddevice "$laptopMic" 3 Recorder
  52. $switchToMic=$laptopMic
  53. }
  54. $message = "当前设备:`n播放: $currentPlayback`n录制: $currentRecording`n切换到:`n播放: $switchToSpeaker`n录制: $switchToMic"
  55. Show-Notification $message
复制代码
脚本逻辑:通过AudioDeviceCmdlets获取当前播放和录制设备名称,判断当前设备类型后,用nircmd切换到另一套设备。nircmd中参数1/2/3分别对应默认设备(播放)、默认通信设备(播放)、默认设备(录制)等角色,Recorder参数指定录制设备。切换完成后弹出Toast通知。

创建快捷方式实现无窗口运行
直接运行PowerShell脚本会弹出黑窗口,可通过快捷方式隐藏窗口。右键audio_switch.ps1创建快捷方式,修改目标为:
  1. C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File "D:\nircmd\audio_switch.ps1"
复制代码
起始位置设为脚本所在文件夹。若希望用快捷键触发,可在快捷方式属性中设置“快捷键”为Ctrl+Alt+A等组合键。之后双击快捷方式或按热键即可触发切换。

热键失效的替代方案:AutoHotKey
若系统热键被占用导致失效,可使用AutoHotKey绑定热键。安装AutoHotKey 2.0版本,创建audio_switch.ahk脚本:
  1. SetWorkingDir %A_ScriptDir%
  2. ^!a::
  3. Run, powershell.exe -NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File "D:\nircmd\audio_switch.ps1",, Hide
  4. return
复制代码
其中^!a表示Ctrl+Alt+A。双击ahk脚本运行,任务栏出现AutoHotKey图标,保持其后台运行,热键即可生效。

注意事项
若需切换更多设备(如三套输入输出),可在脚本中增加elseif分支。设备名称务必与系统中重命名后的完全一致,建议使用 -like 进行模糊匹配。nircmd的路径需在脚本执行时可用,或将nircmd所在目录加入PATH环境变量。

总结
通过PowerShell调用AudioDeviceCmdlets获取设备状态,结合nircmd切换默认音频设备,配合快捷方式或AutoHotKey实现一键切换,并显示Toast通知,避免了手动操作。该方案适用于需要频繁切换音频设备的场景,且完全免费、无需安装额外大型软件。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Windows 11音频设备一键切换:PowerShell+nircmd自动化方案

这个方案看起来非常实用!我平时也经常需要在扬声器和蓝牙耳机之间切换,系统托盘手动切换确实有点麻烦。PowerShell 加 nircmd 的思路很清晰,还能同时切换播放和录制设备,这一点特别方便。 有几个小问题想请教一下楼主: 1. 脚本里用了 `nircmd setdefaultsounddevice` 后面跟了 1、2、3 三个参数,这个数字代表什么?是不同角色(如多媒体、通信)的默认设备设置吗? 2. 通知功能用了 Toast 通知,但里边 AppId 写的是 PowerShell 的路径,会不会导致通知显示的是 PowerShell 图标而不是一个自定义名称?有没有办法改成更直观的显示名? 3. 如果蓝牙耳机没连接时运行脚本,nircmd 会不会报错?脚本里好像没有做错误处理,是否需要加个判断? 另外,我注意到楼主提到的模块 `AudioDeviceCmdlets` 在新版 PowerShell 中可能需要通过 `Install-Module` 从 PowerShell Gallery 安装,建议第一次使用的朋友先确认执行策略(`Set-ExecutionPolicy RemoteSigned`)。 感谢分享,等我把设备重命名完后试试这个脚本!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-5 20:08 , Processed in 0.036365 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部