如何用脚本获取电池状态

wen 实用脚本 3


《笔记本电脑续航守护者:用脚本精准获取电池状态的终极指南》**

如何用脚本获取电池状态


目录导读

  1. 为什么要用脚本监控电池?——从“玄学焦虑”到“数据掌控”
  2. 核心原理:操作系统如何暴露电池数据(ACPI与系统API)
  3. 实战脚本:Windows(PowerShell)、macOS(bash)、Linux(udev + Python)三端全覆盖
  4. 高级玩法:当电量跌破阈值时自动触发省电模式或推送通知
  5. 常见问题与安全排雷(Q&A)
  6. 让脚本成为你的电池“私人医生”

为什么要用脚本监控电池?
许多用户对电池的认知停留在“任务栏小图标”层面,但那个图标只显示百分比和剩余时间,无法提供健康度(设计容量 vs 实际满充容量)充放电循环次数瞬时功率等关键数据,更重要的是,当你在全屏游戏、远程SSH或运行AI训练任务时,系统弹窗提醒不仅突兀,还容易错过,通过脚本,你可以将电池状态写入日志、接入监控大屏,甚至联动智能家居——比如电量低于20%时自动关闭非核心程序。

核心原理:系统如何“交出”电池秘密
所有现代操作系统都遵循 ACPI(高级配置与电源接口) 标准,电池信息被存放在 /sys/class/power_supply/BAT0/(Linux)或通过 IOPowerSources(macOS)和 Win32_Battery(Windows)访问,脚本的本质就是对这些“系统文件”或“API接口”做读取与格式化输出,例如在Linux下,cat /sys/class/power_supply/BAT0/capacity 直接返回0-100的整数,而Windows则需要调用WMI类。

实战脚本:三端获取核心状态

▶ Windows(PowerShell 5.1+)——最常用

# 获取电量百分比、充放电状态、健康度
$battery = Get-WmiObject Win32_Battery
$design = (Get-WmiObject -Namespace root\wmi -Class BatteryStaticData).DesignedCapacity
$full = (Get-WmiObject -Namespace root\wmi -Class BatteryFullChargedCapacity).FullChargedCapacity
$health = [math]::Round($full / $design * 100, 2)
[PSCustomObject]@{
    '电量(%)' = $battery.EstimatedChargeRemaining
    '状态' = if($battery.BatteryStatus -eq 2){'充电中'}else{'放电中'}
    '健康度(%)' = $health
    '循环次数' = (Get-WmiObject -Namespace root\wmi -Class BatteryCycleCount).CycleCount
} | Format-List
# 若需输出为JSON供其他程序调用,将Format-List改为 ConvertTo-Json

注意:部分笔记本需以管理员身份运行才能读取设计容量。

▶ macOS(bash/zsh)——优雅且零依赖

#!/bin/bash
# 利用系统自带的 ioreg 命令
ioreg -rn AppleSmartBattery | grep -E '"MaxCapacity"|"CurrentCapacity"|"CycleCount"|"IsCharging"'
# 计算健康度:MaxCapacity / DesignCapacity(设计容量需从ioreg的“DesignCapacity”字段获取)

若你安装了brew,强烈推荐 brew install battery 命令,它封装了所有细节,直接输出彩色状态条。

▶ Linux(Python + 标准库)——跨发行版万能

#!/usr/bin/env python3
import glob
import os
def read_battery_info():
    paths = glob.glob('/sys/class/power_supply/BAT*')
    if not paths:
        return "未检测到电池(可能为台式机)"
    for path in paths:
        capacity = open(f'{path}/capacity').read().strip()
        status = open(f'{path}/status').read().strip()
        # 有些系统隐藏了能量满值文件,需处理权限
        try:
            energy_full = open(f'{path}/energy_full').read().strip()
            energy_design = open(f'{path}/energy_full_design').read().strip()
            health = int(energy_full)/int(energy_design)*100
        except:
            health = 'N/A'
        print(f"{path.split('/')[-1]}: {capacity}% | {status} | 健康度: {health:.1f}%")
if __name__ == '__main__':
    read_battery_info()

在树莓派等设备上,路径可能是 BAT0BAT1,脚本已用通配符兼容。

高级玩法:阈值报警与自动化省电
给脚本加上循环监控,即可实现“智能管家”,例如在Windows下,每30秒检测一次,若电量低于30%且处于放电状态,则弹出桌面通知并自动将电源计划切换为“节能模式”:

while($true){
    $b = (Get-WmiObject Win32_Battery).EstimatedChargeRemaining
    if($b -lt 30 -and (Get-WmiObject Win32_Battery).BatteryStatus -eq 1){
        powercfg /setactive a1841308-3541-4fab-bc81-f71556f20b4a  # 节能模式GUID
        [System.Windows.Forms.MessageBox]::Show('电量不足!已切换省电模式','电池警报')
    }
    Start-Sleep -Seconds 30
}

Q&A 常见问题快问快答

问:脚本读取的“健康度”准确吗?为什么比厂商软件低5%?
答:因为系统ACPI汇报的是“绝对满充容量”,而厂商软件往往会除以一个保守的设计阈值,差距在5%以内属正常,建议每月校准一次(充满-用到3%-充满)。

问:我的笔记本有双电池(如ThinkPad),脚本只显示BAT0怎么办?
答:将glob通配符改为/sys/class/power_supply/BAT*并遍历循环,或使用BAT1路径,Windows下Get-WmiObject Win32_Battery默认只返回第一块,需结合Win32_PortableBattery处理。

问:脚本报警时能否发送到手机(比如Server酱)?
答:可以,在脚本中调用curlInvoke-RestMethod向微信/Telegram机器人发送HTTP请求,但注意安全——不要把Token硬编码进脚本,建议用环境变量。

问:macOS的ioreg输出太乱,如何提取纯净JSON?
答:使用ioreg -rn AppleSmartBattery -a | plutil -convert json -o - -,配合jq工具筛选字段。

问:脚本会不会唤醒睡眠中的电脑导致耗电?
答:会,但非常轻微,Windows下可用Register-ScheduledTask设置仅在“交流电源”状态下运行;Linux用WakeLock防止睡眠。


电池是笔记本电脑最脆弱的“消耗品”之一,通过上述三端脚本,你不仅告别了“盯着图标猜续航”的旧时代,还能为电池建立长期健康档案——例如每周自动记录健康度曲线,判断衰减速率,当你的电脑“服役”三年后,这份数据将是决定是否换电池的有力证据。脚本不是炫技,而是将模糊感知转译为清晰决策,打开你的终端,把这些代码变成你的守护程序吧。

抱歉,评论功能暂时关闭!