在日常使用Windows 11时,经常需要在笔记本内置扬声器与蓝牙耳机之间快速切换音频输入输出设备,比如开会时用耳机,看视频时换回外放。虽然系统托盘可以手动切换,但效率较低,尤其需要同时切换播放和录制设备时更显繁琐。本文介绍一种基于PowerShell脚本配合第三方工具nircmd的自动化方案,实现一键切换并显示通知。
前置准备:安装AudioDeviceCmdlets模块
该模块提供了Get-AudioDevice等命令,用于获取和设置默认音频设备。在PowerShell中执行以下命令安装:- Install-Module -Name AudioDeviceCmdlets
复制代码 安装后,建议先重命名音频设备,便于脚本识别。在系统声音设置中,将常用设备重命名为简洁、无空格的名称,例如“笔记本扬声器”“笔记本麦克风”“迈从V9pro扬声器”“迈从V9pro麦克风”。重命名步骤:右键任务栏音量图标→声音设置→更多声音设置→播放/录制选项卡,选中设备后右键重命名。
验证当前设备名称
运行以下命令获取当前正在使用的播放和录制设备名称:- Get-AudioDevice -Playback | Select-Object -ExpandProperty Name
- Get-AudioDevice -Recording | Select-Object -ExpandProperty Name
复制代码 输出结果应与之前重命名的名称一致,确保脚本中的匹配字符串正确。
下载nircmd工具
nircmd是一个轻量级命令行工具,提供setdefaultsounddevice命令切换默认音频设备。从NirSoft官网下载适合系统架构的版本(32位或64位),解压到指定文件夹,例如D:\nircmd。该工具无需安装。
编写切换脚本
在nircmd同目录下创建audio_switch.ps1,内容如下(可根据实际设备名称调整):- [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
- [Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
- [Windows.UI.Notifications.ToastNotification, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
- [Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null
- function Show-Notification {
- param ([string]$Message)
- $AppId = "{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\WindowsPowerShell\v1.0\powershell.exe"
- $Template = @"
- <toast>
- <visual>
- <binding template="ToastText01">
- <text id="1">$Message</text>
- </binding>
- </visual>
- </toast>
- "@
- $XmlDoc = New-Object Windows.Data.Xml.Dom.XmlDocument
- $XmlDoc.LoadXml($Template)
- $Toast = New-Object Windows.UI.Notifications.ToastNotification $XmlDoc
- [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($AppId).Show($Toast)
- }
- $laptopSpeaker = "笔记本扬声器"
- $laptopMic = "笔记本麦克风"
- $bluetoothSpeaker = "迈从V9pro扬声器"
- $bluetoothMic = "迈从V9pro麦克风"
- $switchToSpeaker = ""
- $switchToMic = ""
- $currentPlayback = Get-AudioDevice -Playback | Select-Object -ExpandProperty Name
- $currentRecording = Get-AudioDevice -Recording | Select-Object -ExpandProperty Name
- if($currentPlayback -like "*笔记本扬声器*") {
- nircmd setdefaultsounddevice "$bluetoothSpeaker" 1
- nircmd setdefaultsounddevice "$bluetoothSpeaker" 2
- nircmd setdefaultsounddevice "$bluetoothSpeaker" 3
- $switchToSpeaker=$bluetoothSpeaker
- }
- elseif($currentPlayback -like "*迈从V9pro扬声器*") {
- nircmd setdefaultsounddevice "$laptopSpeaker" 1
- nircmd setdefaultsounddevice "$laptopSpeaker" 2
- nircmd setdefaultsounddevice "$laptopSpeaker" 3
- $switchToSpeaker=$laptopSpeaker
- }
- if($currentRecording -like "*笔记本麦克风*") {
- nircmd setdefaultsounddevice "$bluetoothMic" 1 Recorder
- nircmd setdefaultsounddevice "$bluetoothMic" 2 Recorder
- nircmd setdefaultsounddevice "$bluetoothMic" 3 Recorder
- $switchToMic=$bluetoothMic
- }
- elseif($currentRecording -like "*迈从V9pro麦克风*") {
- nircmd setdefaultsounddevice "$laptopMic" 1 Recorder
- nircmd setdefaultsounddevice "$laptopMic" 2 Recorder
- nircmd setdefaultsounddevice "$laptopMic" 3 Recorder
- $switchToMic=$laptopMic
- }
- $message = "当前设备:`n播放: $currentPlayback`n录制: $currentRecording`n切换到:`n播放: $switchToSpeaker`n录制: $switchToMic"
- Show-Notification $message
复制代码 脚本逻辑:通过AudioDeviceCmdlets获取当前播放和录制设备名称,判断当前设备类型后,用nircmd切换到另一套设备。nircmd中参数1/2/3分别对应默认设备(播放)、默认通信设备(播放)、默认设备(录制)等角色,Recorder参数指定录制设备。切换完成后弹出Toast通知。
创建快捷方式实现无窗口运行
直接运行PowerShell脚本会弹出黑窗口,可通过快捷方式隐藏窗口。右键audio_switch.ps1创建快捷方式,修改目标为:- 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脚本:- SetWorkingDir %A_ScriptDir%
- ^!a::
- Run, powershell.exe -NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File "D:\nircmd\audio_switch.ps1",, Hide
- return
复制代码 其中^!a表示Ctrl+Alt+A。双击ahk脚本运行,任务栏出现AutoHotKey图标,保持其后台运行,热键即可生效。
注意事项
若需切换更多设备(如三套输入输出),可在脚本中增加elseif分支。设备名称务必与系统中重命名后的完全一致,建议使用 -like 进行模糊匹配。nircmd的路径需在脚本执行时可用,或将nircmd所在目录加入PATH环境变量。
总结
通过PowerShell调用AudioDeviceCmdlets获取设备状态,结合nircmd切换默认音频设备,配合快捷方式或AutoHotKey实现一键切换,并显示Toast通知,避免了手动操作。该方案适用于需要频繁切换音频设备的场景,且完全免费、无需安装额外大型软件。 |