从 PowerShell 调用 Win32 GetSystemPowerStatus — 直接观察电源状态

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

关于本文
本文是通过利用生成式 AI 的自动化生成流程创建的。我们确认了 Microsoft Learn 的 Win32 GetSystemPowerStatus 规范,并将其整理为通过 PowerShell 使用 P/Invoke 仅读取一次电源状态的冒烟测试(Smoke Test)。

验证状态:📘 已确认 Microsoft 官方规范・Windows 实机未验证

本次 TRY 的成功条件是:成功调用 Win32 API,并能够显示交流电源状态和电池剩余电量的数值。不进行任何设置更改。

冒烟测试

Add-Type @'
using System;
using System.Runtime.InteropServices;
public static class PowerStatusNative {
  [StructLayout(LayoutKind.Sequential)]
  public struct SYSTEM_POWER_STATUS {
    public byte ACLineStatus; public byte BatteryFlag; public byte BatteryLifePercent; public byte SystemStatusFlag;
    public uint BatteryLifeTime; public uint BatteryFullLifeTime;
  }
  [DllImport("kernel32.dll", SetLastError=true)]
  public static extern bool GetSystemPowerStatus(out SYSTEM_POWER_STATUS s);
}
'@
$s = New-Object PowerStatusNative+SYSTEM_POWER_STATUS
if ([PowerStatusNative]::GetSystemPowerStatus([ref]$s)) { "[SUCCESS] ACLineStatus=$($s.ACLineStatus) Battery=$($s.BatteryLifePercent)%" }
else { "[FAILED] Win32Error=$([Runtime.InteropServices.Marshal]::GetLastWin32Error())" }

观察

ACLineStatus 为 0/1/255 等,BatteryLifePercent 为 0 到 100,未知时为 255。切勿将 255 显示为 255%这一点非常重要。

Why — PowerShell 能够调用 Win32 API 的原因

Add-Type 编译一个小的 C# 声明,并通过 P/Invoke 调用 kernel32.dll 的函数。即使 PowerShell 的 cmdlet 中没有所需的信息,也能访问 Windows 的原生 API。

尝试更改一个地方

如果是可以连接/断开交流适配器的笔记本电脑,只需改变这一个物理条件,ACLineStatus 观察其中的差异。

Failure / Boundary

即使 API 调用成功,也并非所有字段都包含有意义的值。应区分未知值、无电池情况以及虚拟环境,切勿仅凭单次数值就判定发生故障。

如果在工作中实际使用

可用于会议室电脑或外带终端的简易诊断,作为服务台确认是否连接交流电源及能否获取剩余电量的切入点。

官方信息与第一手资料

GitHub 示例

文档信息

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

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

标题和URL已复制