关于本文
本文是通过利用生成式 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 上查阅。
查看此处
如果是笔记本电脑,RemainingChargePercent、BatteryStatus、PowerSupplyStatus 是一个很容易观察的值。在没有电池的环境(如台式电脑)中,其值未必与笔记本电脑相同。
重要的不是数值本身,而是 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、状态和显示之间的联系。

