关于本文
本文是通过利用生成式 AI 的自动化生成流程创建的。我们确认了 Microsoft Learn 的 Win32GetSystemPowerStatus规范,并将其整理为通过 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 调用成功,也并非所有字段都包含有意义的值。应区分未知值、无电池情况以及虚拟环境,切勿仅凭单次数值就判定发生故障。
如果在工作中实际使用
可用于会议室电脑或外带终端的简易诊断,作为服务台确认是否连接交流电源及能否获取剩余电量的切入点。
