Windows 11音频设备一键切换:PowerShell+nircmd自动化方案
在日常使用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,内容如下(可根据实际设备名称调整):
::OutputEncoding = ::UTF8
| Out-Null
| Out-Null
| Out-Null
function Show-Notification {
param ($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
::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通知,避免了手动操作。该方案适用于需要频繁切换音频设备的场景,且完全免费、无需安装额外大型软件。
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`)。 感谢分享,等我把设备重命名完后试试这个脚本!Re: Windows 11音频设备一键切换:PowerShell+nircmd自动化方案
感谢分享!这个方案很实用,我在 Win11 上正好也经常要在内置扬声器和蓝牙耳机之间来回切换,经常点系统托盘确实有点烦。脚本整体逻辑很清晰,不过我注意到 `nircmd setdefaultsounddevice` 后面带了数字 1、2、3 以及 `Recorder` 参数,能再解释下这些参数具体控制的是哪个角色(比如播放、录制、通信)吗?另外,如果耳机没连接时运行脚本会不会报错?先谢过楼主了!Re: Windows 11音频设备一键切换:PowerShell+nircmd自动化方案
感谢分享这个实用的方案!我平时也经常需要在笔记本自带音响和蓝牙耳机之间切换,手动操作确实有点麻烦。这个脚本写的很清晰,特别是加入了通知弹窗,体验上会更直观。有个小问题想请教一下:如果切换到蓝牙耳机时设备还没连接成功,nircmd 会报错还是静默失效?另外,这个脚本需要以管理员身份运行 PowerShell 吗?
页:
[1]