怎么用脚本获取系统音效方案

wen 实用脚本 3

本文目录导读:

怎么用脚本获取系统音效方案

  1. Windows (最常用)
  2. macOS (macOS 声音主题)
  3. Linux (基于 PulseAudio/PipeWire)
  4. Web 浏览器 (JavaScript)

获取系统音效方案(即当前系统使用的声音主题声音方案)的方法强烈依赖操作系统,最常用的场景是 Windows,因为它有经典的控制面板声音方案,macOS 和 Linux 在此方面的定义和获取方式则大不相同。

以下是针对不同操作系统的脚本方法:

Windows (最常用)

Windows 将当前声音方案信息存储在注册表中,你可以通过 PowerShell 或 CMD 脚本来读取。

方法 A:使用 PowerShell (推荐)

这个脚本可以获取当前使用的声音方案名称

# 获取当前声音方案的注册表值
$schemeKey = "HKCU:\AppEvents\Schemes"
$currentSchemeGUID = (Get-ItemProperty -Path "HKCU:\AppEvents\Schemes" -Name "(Default)" -ErrorAction SilentlyContinue).'(Default)'
if ($currentSchemeGUID) {
    # 根据GUID查找方案名称
    $schemeNamePath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\SoundScheme"
    # 方案名称通常在 HKCU 下的子键中,或者通过 (Default) 值查找
    # 更精确的方法:在 HKCU:\AppEvents\Schemes 下,每个子键代表一个方案,其 (Default) 值就是名称
    $schemeNames = Get-ChildItem -Path "HKCU:\AppEvents\Schemes" | Where-Object { $_.PSChildName -ne "Apps" }
    $currentSchemeName = $null
    foreach ($scheme in $schemeNames) {
        $schemeGUID = $scheme.PSChildName
        if ($schemeGUID -eq $currentSchemeGUID) {
            $currentSchemeName = (Get-ItemProperty -Path $scheme.PSPath -Name "(Default)" -ErrorAction SilentlyContinue).'(Default)'
            break
        }
    }
    if (-not $currentSchemeName) {
        # 如果找不到友好名称,则显示原始GUID
        $currentSchemeName = $currentSchemeGUID
    }
    Write-Host "当前系统声音方案: $currentSchemeName"
} else {
    Write-Host "无法获取当前声音方案信息。"
}
# 可选:列出所有可用的声音方案
# Get-ChildItem -Path "HKCU:\AppEvents\Schemes" | Where-Object { $_.PSChildName -ne "Apps" } | ForEach-Object { Write-Host $_.PSChildName }

解释:

  • Windows 使用 GUID (如 {.e17..}) 来标识声音方案。
  • 当前激活的方案的 GUID 存储在 HKCU:\AppEvents\Schemes 的默认值中。
  • 你可以在 HKCU:\AppEvents\Schemes 下找到所有已安装的方案,每个子键的 (Default) 值就是方案名称(如 "Windows Default"、"无声")。

方法 B:使用 CMD (批处理)

CMD 对注册表的处理能力较弱,但可以配合 reg query 实现。

@echo off
setlocal enabledelayedexpansion
:: 获取当前声音方案的GUID
for /f "tokens=3" %%a in ('reg query "HKCU\AppEvents\Schemes" /ve 2^>nul') do set "scheme_guid=%%a"
:: 如果找不到,尝试查找默认方案
if "%scheme_guid%"=="" (
    for /f "tokens=3" %%a in ('reg query "HKCU\AppEvents\Schemes" /v "(Default)" 2^>nul') do set "scheme_guid=%%a"
)
if defined scheme_guid (
    echo 当前声音方案GUID: %scheme_guid%
    :: 尝试获取友好名称 (直接在 Schemes 下查找)
    for /f "tokens=1,* delims=\" %%i in ('reg query "HKCU\AppEvents\Schemes" 2^>nul') do (
        set "key_path=%%i\%%j"
        set "guid_only=%%j"
        if "!guid_only!"=="!scheme_guid!" (
            for /f "tokens=3" %%n in ('reg query "HKCU\AppEvents\Schemes\!scheme_guid!" /ve 2^>nul') do (
                echo 方案名称: %%n
            )
        )
    )
) else (
    echo 无法获取声音方案。
)
endlocal
pause

macOS (macOS 声音主题)

macOS 没有像 Windows 那样的“声音方案”概念,它主要使用独立的系统声音设置。

你可以获取的信息:

  1. 当前选中的“提示音”:

    # 获取当前系统提示音 (Alert Sound) 的名称
    defaults read NSGlobalDomain com.apple.sound.beep.sound
    # 通常输出类似: "/System/Library/Sounds/Funk.aiff"

    这个命令会返回一个路径,而不是一个“方案”,这个声音是固定的,没有“方案”切换。

  2. 获取所有可用系统音效列表:

    ls /System/Library/Sounds/

为什么 macOS 没有“声音方案”? macOS 的设计是用户单独选择登录项音效、通知音效、邮件音效等,而不是一个预定义的声音集合(方案),所以没有直接的“声音方案”概念。

Linux (基于 PulseAudio/PipeWire)

Linux 桌面环境通常使用 PulseAudio 或 PipeWire,并且声音方案取决于桌面环境设置

方法 A:获取 PulseAudio 的默认输出/输入 (不是“方案”)

# 获取默认的音频输出端口
pactl get-default-sink
# 获取默认的音频输入端口
pactl get-default-source
# 获取所有音频端口的状态
pactl list sinks short

方法 B:获取桌面环境的声音主题 (如果存在)

某些桌面环境(如 GNOME、KDE)有自己的声音主题设置,但这些设置储存在桌面环境的配置文件中(通常是 dconf 或配置文件)。

GNOME:

# 获取当前 sound theme (如果设置了)
gsettings get org.gnome.desktop.sound theme-name
# 输出可能是: 'freedesktop' 或 'your-custom-theme'

KDE Plasma: KDE 的声音方案通常存储在 ~/.config/ 下的配置文件中,格式复杂,通常需要通过 kwriteconfig5 或直接解析 ~/.config/baloofilerc 等文件。

Web 浏览器 (JavaScript)

在网页中,你不能“获取系统声音方案”,这是出于安全限制,浏览器无法直接访问操作系统级别的设置或文件系统。

你能做的:

  • 使用 Web Audio API 获取音频输出设备信息,但能获取的是输出设备的名称(如 “扬声器 (Realtek Audio)”),而不是“声音方案”。
  • 使用 navigator.mediaDevices.enumerateDevices() 可以列出音频设备,但没有声音方案信息。

示例:列出音频设备

navigator.mediaDevices.enumerateDevices()
  .then(devices => {
    devices.forEach(device => {
      if (device.kind === 'audiooutput') {
        console.log('音频输出设备:', device.label);
      }
    });
  });
操作系统 最佳方法 核心命令/技术
Windows PowerShell Get-ItemProperty HKCU:\AppEvents\Schemes
macOS Terminal defaults read NSGlobalDomain com.apple.sound.beep.sound
Linux (GNOME) Terminal gsettings get org.gnome.desktop.sound theme-name
Web 浏览器 受限 navigator.mediaDevices.enumerateDevices() (只能获取设备名)

建议: 如果你需要的是一个跨平台的解决方案,建议根据 process.platform (Node.js) 或 $OSType (PowerShell) 检测操作系统,然后分别调用对应的命令,直接获取“声音方案”在非 Windows 平台上通常无法得到一个简单的字符串结果。

抱歉,评论功能暂时关闭!