如何用脚本获取设备电源状态(实战指南)
目录导读
- 核心问题:为什么需要脚本监控电源状态?
- 技术准备:支持的平台与前置条件
- 实战方法:Windows/Linux/macOS 三平台脚本方案
- 高级技巧:远程设备电源状态获取
- 常见问答:踩坑总结与解决方案
核心问题:为什么需要脚本监控电源状态?
在日常运维、自动化测试或家庭智能管理中,获取设备电源状态是基础但关键的一环。

- 服务器是否意外关机?
- 远程工控机是否断电?
- 笔记本是否处于充电状态以优化电池寿命?
使用脚本获取电源状态,远比手动查看更高效,且能集成到告警系统或自动化流程中,本文将提供跨平台、可直接复制运行的脚本方案,并解决常见的权限与兼容性问题。
技术准备:支持的平台与前置条件
1 支持的操作系统
| 平台 | 适用脚本语言 | 核心命令/API |
|---|---|---|
| Windows | PowerShell / CMD | wmic, Get-WmiObject, powercfg |
| Linux | Bash / Python | /sys/class/power_supply/, acpi |
| macOS | Bash / Swift | pmset, ioreg |
2 前置条件
- 权限:Windows 需管理员权限(部分命令),Linux/macOS 一般普通用户即可。
- 工具:Windows PowerShell 5.0+,Linux 需安装
acpi工具(可选)。 - 安全:脚本不要暴露明文密码(如需远程访问,使用密钥认证)。
实战方法:三平台脚本方案
1 Windows:PowerShell 脚本
场景:检测当前设备是“插入电源”还是“使用电池”,以及电池剩余百分比。
# Get-PowerStatus.ps1
$battery = Get-WmiObject -Class Win32_Battery
if ($battery) {
$status = switch ($battery.BatteryStatus) {
1 { "电池放电中" }
2 { "交流电接入(充电中)" }
3 { "完全充满" }
4 { "低电量" }
5 { "临界电量" }
6 { "正在充电" }
7 { "充电完成" }
8 { "无电池" }
default { "未知状态" }
}
Write-Output "电源状态: $status"
Write-Output "剩余电量: $($battery.EstimatedChargeRemaining)%"
} else {
# 无电池设备(如台式机),直接检测电源连接
$power = Get-WmiObject -Class Win32_PowerSupply
if ($power.Availability -eq 3) {
Write-Output "电源状态: 交流电供电"
} else {
Write-Output "电源状态: 未知或异常"
}
}
执行:右键以管理员身份运行 PowerShell,或保存为 .ps1 后执行 .\Get-PowerStatus.ps1。
2 Linux:Bash 脚本
场景:检测笔记本是否接通电源、电池电量,支持 Ubuntu/Debian/CentOS。
#!/bin/bash
# power_status.sh
# 方法1:读取 sysfs(无需额外工具)
if [ -d /sys/class/power_supply/AC0 ]; then
ac_status=$(cat /sys/class/power_supply/AC0/online)
if [ "$ac_status" -eq 1 ]; then
echo "电源状态: 交流电接通"
else
echo "电源状态: 使用电池"
fi
elif [ -d /sys/class/power_supply/BAT0 ]; then
capacity=$(cat /sys/class/power_supply/BAT0/capacity)
status=$(cat /sys/class/power_supply/BAT0/status)
echo "电池状态: $status"
echo "剩余电量: $capacity%"
else
echo "未检测到电池或电源信息"
fi
# 方法2:使用 acpi 工具(更友好)
if command -v acpi &> /dev/null; then
acpi_info=$(acpi -a 2>/dev/null)
if [ -n "$acpi_info" ]; then
echo "ACPI检测: $acpi_info"
fi
fi
执行:chmod +x power_status.sh && ./power_status.sh
3 macOS:Bash + pmset 脚本
场景:检测 MacBook 是否在充电、电池健康状态。
#!/bin/bash
# mac_power.sh
# 获取电源状态
power_info=$(pmset -g batt)
echo "当前电源信息:"
echo "$power_info" | grep -E "InternalBattery|Charging|AC Power"
# 是否正在充电
if pmset -g batt | grep -q "AC Power"; then
echo "电源连接: 交流电供电"
else
echo "电源连接: 使用电池"
fi
# 电池百分比
batt_percent=$(pmset -g batt | grep -oE "\d+%" | head -1)
echo "电池电量: $batt_percent"
执行:chmod +x mac_power.sh && ./mac_power.sh
高级技巧:远程设备电源状态获取
1 通过 SSH 获取远程 Linux 主机状态
# 前提:配置了 SSH 密钥认证 ssh user@remote-host "cat /sys/class/power_supply/AC0/online"
集成到监控脚本:
#!/bin/bash
# remote_power_check.sh
declare -A HOSTS=(
["server01"]="192.168.1.10"
["server02"]="192.168.1.20"
)
for name in "${!HOSTS[@]}"; do
ip=${HOSTS[$name]}
status=$(ssh root@"$ip" "cat /sys/class/power_supply/AC0/online 2>/dev/null || echo 'N/A'")
echo "$name ($ip): 电源状态=$([ "$status" -eq 1 ] && echo '接通' || echo '断开或未检测到')"
done
2 通过 WMI 远程获取 Windows 主机(需 PowerShell Remoting 或 WinRM)
$cred = Get-Credential
$session = New-PSSession -ComputerName "远程IP" -Credential $cred
Invoke-Command -Session $session -ScriptBlock {
$batt = Get-WmiObject -Class Win32_Battery
if ($batt) { $batt.BatteryStatus } else { "无电池" }
}
Remove-PSSession $session
安全建议:使用 Kerberos 认证或证书,避免使用明文密码。
常见问答:踩坑总结与解决方案
Q1:为什么 Windows 脚本返回“无电池”但设备明明有电池?
A:部分笔记本的电池被系统识别为“UPS”设备,尝试使用 Get-WmiObject -Class Win32_UPS 或 powercfg /batteryreport 生成报告查看。
Q2:Linux 下 /sys/class/power_supply/AC0 不存在怎么办?
A:不同的内核版本或硬件会导致路径差异,尝试:
- 查看
ls /sys/class/power_supply/列出所有设备,如ADP1,BAT1等。 - 使用
upower -d或acpi -V获取通用信息。
Q3:脚本返回的电源状态是英文,如何适配中文环境?
A:在脚本中增加 case 映射翻译即可,PowerShell 中的 BatteryStatus 数值对应上文已给出中文映射。
Q4:如何让脚本每隔10分钟自动检查并保存日志?
A:结合系统计划任务(Windows:Task Scheduler;Linux:crontab)。
# cron作业示例(每10分钟检查一次) */10 * * * * /home/user/power_status.sh >> /var/log/power.log
Q5:需要获取设备是否“插着电但没在充电”(如已充满)?
A:检查 BatteryStatus(Windows)或 status 文件(Linux),充满状态通常为 3(Windows)或 Full(Linux/macOS)。
通过本文的脚本方法,你可以零成本实现设备电源状态的自动化获取,无论是本地单机还是远程大规模服务器群,关键点在于:
- 选择平台对应的 API(WMI、sysfs、pmset)
- 处理权限和路径差异
- 集成到告警或自动化流程
建议将脚本保存为模板,并根据实际设备名称(如 AC0 → AC1)微调,若需跨平台统一管理,可考虑用 Python 编写封装脚本,利用 platform 模块自动识别。
实时掌握电源状态,让运维更智能。