PowerShellからWin32 GetSystemPowerStatusを呼ぶ ― 電源状態を直接観察する

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

この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。Microsoft LearnのWin32 GetSystemPowerStatus 仕様を確認し、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接続や残量取得可否を確認する入口にできます。

公式情報・一次情報

GitHubサンプル

文書情報

記事タイトル
PowerShellからWin32 GetSystemPowerStatusを呼ぶ ― 電源状態を直接観察する
作成日
更新日
Source URL
https://papanda925.com/?p=16008

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

タイトルとURLをコピーしました