怎么用脚本获取设备电源状态

wen 实用脚本 2

如何用脚本获取设备电源状态(实战指南)

目录导读

  1. 核心问题:为什么需要脚本监控电源状态?
  2. 技术准备:支持的平台与前置条件
  3. 实战方法:Windows/Linux/macOS 三平台脚本方案
  4. 高级技巧:远程设备电源状态获取
  5. 常见问答:踩坑总结与解决方案

核心问题:为什么需要脚本监控电源状态?

在日常运维、自动化测试或家庭智能管理中,获取设备电源状态是基础但关键的一环。

怎么用脚本获取设备电源状态

  • 服务器是否意外关机?
  • 远程工控机是否断电?
  • 笔记本是否处于充电状态以优化电池寿命?

使用脚本获取电源状态,远比手动查看更高效,且能集成到告警系统或自动化流程中,本文将提供跨平台、可直接复制运行的脚本方案,并解决常见的权限与兼容性问题。


技术准备:支持的平台与前置条件

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_UPSpowercfg /batteryreport 生成报告查看。

Q2:Linux 下 /sys/class/power_supply/AC0 不存在怎么办?

A:不同的内核版本或硬件会导致路径差异,尝试:

  • 查看 ls /sys/class/power_supply/ 列出所有设备,如 ADP1, BAT1 等。
  • 使用 upower -dacpi -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)
  • 处理权限和路径差异
  • 集成到告警或自动化流程

建议将脚本保存为模板,并根据实际设备名称(如 AC0AC1)微调,若需跨平台统一管理,可考虑用 Python 编写封装脚本,利用 platform 模块自动识别。

实时掌握电源状态,让运维更智能。

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