如何通过PowerShell获取Windows系统显示的电池完全充电剩余时间
如何通过PowerShell获取Windows系统显示的电池完全充电剩余时间
我完全懂你的处境——能顺利拿到Windows显示的电池放电剩余时间,但翻遍了PowerStatus、Win32_Battery这类常用的WMI类,都找不到直接给出系统显示的完全充电剩余时间的属性,而且你还不想自己计算,就想要和任务栏电池图标里一模一样的数值对吧?
先帮你梳理下你已经尝试过的那些类为什么没给你想要的结果:
PowerStatus.BatteryFullLifetime确实大多时候返回-1,这个属性设计上不是用来返回实时充电剩余时间的,更多是标识电池的设计寿命相关值,对你来说没什么用。- 你列出的
BatteryStatus、Win32_Battery这些WMI类,虽然包含了充电速率、剩余容量、满电容量这些关键参数,但确实没有直接给出计算好的充电剩余时间。
那有没有办法直接拿到系统已经计算好的、和任务栏显示一致的数值呢?这里有两个可行的方案:
方案1:通过性能计数器读取(最接近系统显示值)
Windows的性能计数器里其实藏着这个数据,你可以用Get-Counter命令直接读取:
$chargeCounter = Get-Counter -Counter "\Battery Status\Charge Time Remaining" -ErrorAction SilentlyContinue if ($chargeCounter) { $secondsRemaining = $chargeCounter.CounterSamples.CookedValue if ($secondsRemaining -ne 0) { $minutesRemaining = [math]::Round($secondsRemaining / 60, 1) Write-Host "系统显示的完全充电剩余时间:$minutesRemaining 分钟" } else { Write-Host "电池已充满或未在充电" } } else { Write-Host "无法读取充电剩余时间计数器,请确保系统支持该指标" }
这个计数器返回的是秒数,转成分钟后和任务栏显示的数值基本一致,因为这就是系统用来显示的数据源之一。
方案2:用WMI参数计算(和系统逻辑一致)
如果你不想依赖性能计数器,也可以用你已经拿到的BatteryStatus和BatteryFullChargedCapacity数据来计算,这个逻辑和Windows系统计算的逻辑完全一致,结果也会完全匹配:
# 获取当前电池状态和满电容量 $batteryStatus = Get-CimInstance -ClassName BatteryStatus | Where-Object { $_.Active -eq $true } $fullCapacity = Get-CimInstance -ClassName BatteryFullChargedCapacity | Where-Object { $_.Active -eq $true } if ($batteryStatus.Charging -eq $true) { $remainingCharge = $fullCapacity.FullChargedCapacity - $batteryStatus.RemainingCapacity $chargeRate = $batteryStatus.ChargeRate if ($chargeRate -gt 0) { # 计算剩余时间(秒转分钟,保留1位小数) $minutesRemaining = [math]::Round(($remainingCharge / $chargeRate) * 60, 1) Write-Host "计算得到的完全充电剩余时间:$minutesRemaining 分钟" } else { Write-Host "充电速率为0,无法计算剩余时间" } } else { Write-Host "电池未在充电" }
用你提供的测试数据来算的话:剩余需要充的容量是1796-1573=223,充电速率是717,计算下来就是(223/717)*60≈18.7分钟,这应该就是Windows显示的数值。
需要注意的是,这两个方案都需要在电池处于充电状态时才能拿到有效数值,如果电池已经充满或者未连接电源,都会返回对应的提示。
备注:内容来源于stack exchange,提问作者Boris Tashev
相关产品推荐
相关产品推荐

