Public/Get-BatteryInfo.ps1
|
function Get-BatteryInfo { <# .SYNOPSIS Returns battery information as a PSCustomObject, or $null if no battery. .DESCRIPTION Collects battery status, charge percent, and whether charging. Works cross-platform. Pipe to ConvertTo-Json for JSON output. .EXAMPLE Get-BatteryInfo Get-BatteryInfo | ConvertTo-Json #> [CmdletBinding()] [OutputType([PSCustomObject])] param() $platform = Get-PlatformType switch ($platform) { 'Windows' { $bat = Get-CimInstance -ClassName Win32_Battery -ErrorAction SilentlyContinue if (-not $bat) { return [PSCustomObject]@{ Present = $false; ChargePercent = 0; IsCharging = $false; Status = 'No battery' } } $charging = $bat.BatteryStatus -in @(2, 6, 7, 8, 9) [PSCustomObject]@{ Present = $true ChargePercent = [int]($bat.EstimatedChargeRemaining ?? 0) IsCharging = $charging Status = if ($charging) { 'Charging' } else { 'Discharging' } } } 'Linux' { $batPath = '/sys/class/power_supply/BAT0' if (-not (Test-Path $batPath)) { return [PSCustomObject]@{ Present = $false; ChargePercent = 0; IsCharging = $false; Status = 'No battery' } } $capacity = 0 if (Test-Path "$batPath/capacity") { $capacity = [int](Get-Content "$batPath/capacity" -ErrorAction SilentlyContinue) } $status = 'Unknown' if (Test-Path "$batPath/status") { $status = (Get-Content "$batPath/status" -ErrorAction SilentlyContinue).Trim() } [PSCustomObject]@{ Present = $true ChargePercent = $capacity IsCharging = $status -eq 'Charging' Status = $status } } 'macOS' { $pmOutput = Invoke-PlatformCommand 'pmset' @('-g', 'batt') 2>/dev/null if (-not $pmOutput -or "$pmOutput" -notmatch '(\d+)%') { return [PSCustomObject]@{ Present = $false; ChargePercent = 0; IsCharging = $false; Status = 'No battery' } } $pct = [int]$Matches[1] $charging = "$pmOutput" -match 'charging' [PSCustomObject]@{ Present = $true ChargePercent = $pct IsCharging = $charging -and ("$pmOutput" -notmatch 'discharging') Status = if ($charging -and "$pmOutput" -notmatch 'discharging') { 'Charging' } else { 'Discharging' } } } default { [PSCustomObject]@{ Present = $false; ChargePercent = 0; IsCharging = $false; Status = 'Unknown' } } } } |