从 PowerShell 直接调用 WinRT —— 使用 PowerManager 观察 Windows 电源状态

PowerShellカテゴリを表すパンダのイラスト PowerShell

关于本文
本文是通过利用生成式 AI 的自动化生成流程创建的。我们重新确认了 Windows 运行时 (Windows Runtime) 的 PowerManager 官方 API 以及现有的 Daily-Code-Samples,并将其整理为从 PowerShell 读取电源状态的最小冒烟测试。

验证状态:📘 已确认官方信息,未在 Windows 实机上验证

通过从 PowerShell 直接调用 WinRT,您可以体验到“从 OS API 而非 cmdlet 读取”Windows 电源状态的过程。本次成功的条件是:[SUCCESS] 以及显示诸如 RemainingChargePercent 等一个或多个值。

首先运行

目标环境为 Windows PowerShell 5.1 + Windows 10/11。由于只是读取数值,因此不需要管理员权限。

$pm = [Windows.System.Power.PowerManager, Windows.System.Power, ContentType = WindowsRuntime]

Write-Host '[START] PowerManager を読みます'
try {
    $result = [pscustomobject]@{
        RemainingChargePercent = $pm::RemainingChargePercent
        BatteryStatus          = [string]$pm::BatteryStatus
        PowerSupplyStatus      = [string]$pm::PowerSupplyStatus
        EnergySaverStatus      = [string]$pm::EnergySaverStatus
    }

    Write-Host '[SUCCESS] PowerManager を読み取れました'
    $result | Format-List
}
catch {
    Write-Host '[FAILED] PowerManager の読み取りに失敗しました'
    Write-Host ("Type    : {0}" -f $_.Exception.GetType().FullName)
    Write-Host ("Message : {0}" -f $_.Exception.Message)
}

PowerManager 公开的属性可以在 Microsoft Learn 上查阅。

查看此处

如果是笔记本电脑,RemainingChargePercentBatteryStatusPowerSupplyStatus 是一个很容易观察的值。在没有电池的环境(如台式电脑)中,其值未必与笔记本电脑相同。

重要的不是数值本身,而是 PowerShell 经过了以下层级:

flowchart LR
    PS[Windows PowerShell 5.1] --> RT[WinRT 型解決]
    RT --> PM[Windows.System.Power.PowerManager]
    PM --> OS[Windows の電源状態]
    OS --> PM --> PS

ContentType = WindowsRuntime 是用于“将该类型解析为 Windows 运行时类型”的指定。它调用的并不是普通的 PowerShell cmdlet。

尝试更改一个地方

如果在笔记本电脑上安全地进行测试,请保持代码不变,仅更改 AC 适配器的连接状态然后重新运行。BatteryStatus观察 PowerSupplyStatus

如何发生变化。关键在于不要断定“一定会出现这个值”。结果会因硬件、驱动程序和电源状态而异。

为什么要从 PowerShell 操作 WinRT

WinRT 是 Windows 面向应用程序公开的 API 集合之一。对于可以从 PowerShell 直接解析类型的 API,我们可以借此小规模地观察“Windows 的设置和状态在 GUI 的底层是以怎样的 API 公开的”。

虽然这与从 VBA 声明 (Declare) 并调用 Win32 API 的入口不同,但“通过其他语言利用操作系统公开的 API”这一思路是相通的。

如果在工作中应用

不能直接将这个最小示例用作监控系统,还需要添加以下内容:

  • 记录 PowerShell/Windows 版本

  • 假设为没有电池的 PC

  • 不要将获取失败视作成功

  • 不要在日志中输出不必要的终端信息

  • 不要武断地认为相同的代码能在 PowerShell 7 中运行

由于这次是冒烟测试,因此首先只调用一次 API,明确是否能获取到值。

GitHub 示例

复用版本包含成功/失败显示以及附加属性。

官方信息与一手资料

总结

通过从 PowerShell 调用 WinRT,可以从 OS API 的入口观察 Windows 的电源状态。首先将范围缩小到“只要能获取到一个值即为成功”,接着只改变一个条件(如 AC 连接状态),这样就更容易追踪 API、状态和显示之间的联系。

文档信息

文章??
从 PowerShell 直接调用 WinRT —— 使用 PowerManager 观察 Windows 电源状态
?布日期
更新日期
来源
https://papanda925.com/?p=17043&lang=zh

?可: ?于本站?有相??利的正文及原??表,除非?有?明,可依据 CC BY 4.0 使用。本文可能包含使用生成式AI?建或??的内容。若代??有?可声明,或?接的GitHub???定了?可,?代?以??可?准。引用内容、第三方?料、?片及商?不在本?可范?内。 使用政策

标题和URL已复制