この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。Microsoft LearnのWin32GetSystemPowerStatus仕様を確認し、PowerShellからP/Invokeで電源状態を1回だけ読み取るSmoke Testとして整理しました。
検証ステータス:📘 Microsoft公式仕様確認済み・Windows実機未確認
今回のTRY成功条件は、Win32 API呼び出しが成功し、AC電源状態とバッテリー残量の値を表示できることです。設定変更は行いません。
Smoke Test
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())" }
Observe
ACLineStatus は0/1/255など、BatteryLifePercent は0〜100、未知の場合は255です。255を255%と表示しないことが重要です。
Why — PowerShellなのにWin32 APIを呼べる理由
Add-Type で小さなC#宣言をコンパイルし、P/Invokeで kernel32.dll の関数を呼びます。PowerShellのコマンドレットに目的の情報がなくてもWindowsのネイティブAPIへ到達できます。
1か所変えてみる
ACアダプターを接続/切断できるノートPCなら物理条件だけ1つ変え、ACLineStatus の差を観察します。
Failure / Boundary
API成功でも全フィールドが意味のある値とは限りません。未知値、バッテリー非搭載、仮想環境を区別し、1回の値だけで障害判定しません。
仕事で使うなら
会議室PCや持ち出し端末の簡易診断で、ヘルプデスクがAC接続や残量取得可否を確認する入口にできます。
