我想创建一个 PowerShell 脚本来在两个音频输出(耳机和扬声器)之间切换,而不必在系统托盘中多次单击。
我从这个项目开始:Powershell-Default-Audio-Device-Changer
我了解到注册表路径"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\*"
包含所有输出音频设备(“渲染”)。其中每个都有一个“DeviceState”属性。如果“DeviceState”= 1,则音频设备可供使用。某些条目具有“Level:0”、“Level:1”属性。由于某种原因,Windows 似乎会在您切换音频设备时增加这些值。 Windows 对“Level:0”值添加时间戳并查找最新的时间戳。 Reddit discussion
所以我想返回最大“Level:0”值的设备ID。不幸的是,我是一个 PowerShell 新手,尽管付出了数小时的努力,但仍无法弄清楚如何完成这项工作。
这就是我现在所拥有的。它返回所有可用的音频输出设备,并拒绝仅提供最大“Level:0”的设备。如何让“Where-Object”发挥作用?
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\*" |
Where-Object {
(Get-ItemPropertyValue $_.PSPath DeviceState) -eq 1
} |
Where-Object {
(Get-ItemPropertyValue -Path $_.PSPath -Name "Level:0") -eq ($_ | Measure-Object -Property Level:0 -Maximum).Maximum
} |
Format-List
另外...尝试在 VSCode 中调试它。似乎任何产生错误的 Watch 都要求我重新启动 PowerShell 终端......呃。还有人遇到这样的问题吗?
最佳答案
这有帮助吗?
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\*"
| where DeviceState -eq 1 | sort Level:0 | select -ExpandProperty PSChildName -Last 1
关于PowerShell 获取具有最大属性值的注册表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69714559/