如何写一个脚本监控电池电量

wen 实用脚本 2

本文目录导读:

如何写一个脚本监控电池电量

  1. Python 版本(跨平台)
  2. Windows 批处理脚本
  3. Linux Shell 脚本
  4. macOS 脚本
  5. 使用方法
  6. 功能特点

我来提供一个跨平台(Windows/macOS/Linux)的电池电量监控脚本方案:

Python 版本(跨平台)

#!/usr/bin/env python3
"""
电池电量监控脚本
支持 Windows / macOS / Linux
"""
import time
import sys
import subprocess
import platform
from datetime import datetime
try:
    import psutil
except ImportError:
    print("需要安装 psutil: pip install psutil")
    sys.exit(1)
class BatteryMonitor:
    def __init__(self, warning_threshold=20, critical_threshold=10):
        self.warning_threshold = warning_threshold
        self.critical_threshold = critical_threshold
        self.last_notification = {}
    def get_battery_status(self):
        """获取电池状态"""
        try:
            battery = psutil.sensors_battery()
            if battery is None:
                return None
            percent = battery.percent
            is_charging = battery.power_plugged
            return {
                'percent': percent,
                'is_charging': is_charging,
                'time_remaining': self._get_time_remaining(battery)
            }
        except Exception as e:
            print(f"获取电池信息失败: {e}")
            return None
    def _get_time_remaining(self, battery):
        """获取剩余时间"""
        if battery.secsleft and battery.secsleft != psutil.POWER_TIME_UNLIMITED:
            hours = battery.secsleft // 3600
            minutes = (battery.secsleft % 3600) // 60
            return f"{hours}小时{minutes}分钟"
        return "未知"
    def check_alerts(self, status):
        """检查是否需要发送警告"""
        if status is None:
            return
        percent = status['percent']
        is_charging = status['is_charging']
        # 只在非充电状态下检查电量警告
        if not is_charging:
            if percent <= self.critical_threshold:
                self._send_notification("⚠️ 电量严重不足", 
                    f"当前电量仅剩 {percent}%,请立即充电!")
            elif percent <= self.warning_threshold:
                notification_key = f"warning_{self.warning_threshold}"
                # 防止重复通知(每30分钟最多一次)
                last_time = self.last_notification.get(notification_key, 0)
                if time.time() - last_time >= 1800:
                    self._send_notification("🔋 电量不足", 
                        f"当前电量剩余 {percent}%,请及时充电。")
                    self.last_notification[notification_key] = time.time()
        # 充电完成提醒
        elif percent >= 100:
            self._send_notification("✅ 充电完成", "电池已充满,可以拔掉电源了。")
    def _send_notification(self, title, message):
        """发送系统通知"""
        system = platform.system()
        if system == "Windows":
            self._windows_notification(title, message)
        elif system == "Darwin":  # macOS
            self._mac_notification(title, message)
        elif system == "Linux":
            self._linux_notification(title, message)
        print(f"[{datetime.now().strftime('%H:%M:%S')}] {title}: {message}")
    def _windows_notification(self, title, message):
        try:
            # 使用PowerShell发送通知
            import ctypes
            ctypes.windll.user32.MessageBoxW(0, message, title, 0x40)
        except:
            pass
    def _mac_notification(self, title, message):
        try:
            subprocess.run([
                'osascript', '-e',
                f'display notification "{message}" with title "{title}"'
            ], capture_output=True)
        except:
            pass
    def _linux_notification(self, title, message):
        try:
            subprocess.run(['notify-send', '-u', 'normal', title, message], 
                          capture_output=True)
        except:
            pass
    def run(self, check_interval=60):
        """运行监控"""
        print(f"电池监控已启动,每 {check_interval} 秒检查一次")
        print(f"警告阈值: {self.warning_threshold}%, 严重阈值: {self.critical_threshold}%")
        print("按 Ctrl+C 停止监控\n")
        try:
            while True:
                status = self.get_battery_status()
                if status:
                    self.print_status(status)
                    self.check_alerts(status)
                time.sleep(check_interval)
        except KeyboardInterrupt:
            print("\n监控已停止")
    def print_status(self, status):
        """打印电池状态"""
        charging_icon = "⚡" if status['is_charging'] else "🔋"
        print(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} | "
              f"{charging_icon} 电量: {status['percent']}% | "
              f"状态: {'充电中' if status['is_charging'] else '放电中'} | "
              f"预计剩余: {status['time_remaining']}")
def main():
    import argparse
    parser = argparse.ArgumentParser(description='电池电量监控脚本')
    parser.add_argument('-w', '--warning', type=int, default=20,
                       help='警告阈值(默认20%)')
    parser.add_argument('-c', '--critical', type=int, default=10,
                       help='严重警告阈值(默认10%)')
    parser.add_argument('-i', '--interval', type=int, default=60,
                       help='检查间隔(秒,默认60秒)')
    parser.add_argument('-n', '--normal', action='store_true',
                       help='正常模式(只显示,不警告)')
    args = parser.parse_args()
    monitor = BatteryMonitor(args.warning, args.critical)
    monitor.run(args.interval)
if __name__ == '__main__':
    main()

Windows 批处理脚本

@echo off电池电量监控
echo 电池监控启动...
echo 按 Ctrl+C 停止监控
echo.
:loop
for /f "tokens=2 delims==" %%i in ('wmic Path Win32_Battery Get EstimatedChargeRemaining /value') do set "battery=%%i"
set battery=%battery:~0,-2%
echo %time% - 当前电量: %battery%%%
if %battery% LEQ 20 (
    msg * "警告:电池电量低于20%,请及时充电!"
)
if %battery% LEQ 10 (
    msg * "严重警告:电量不足10%,请立即充电!"
)
timeout /t 60 /nobreak >nul
goto loop

Linux Shell 脚本

#!/bin/bash
# 电池监控脚本 (Linux)
while true; do
    clear
    date "+%Y-%m-%d %H:%M:%S"
    # 获取电池状态
    battery_info=$(cat /sys/class/power_supply/BAT0/capacity 2>/dev/null || echo "0")
    status=$(cat /sys/class/power_supply/BAT0/status 2>/dev/null)
    echo "电池电量: $battery_info%"
    echo "状态: $status"
    # 显示可视化电量
    display_battery $battery_info
    # 警告检查
    if [[ "$status" == "Discharging" ]]; then
        if [ "$battery_info" -le 20 ]; then
            notify-send "警告" "电池电量低于20%,请及时充电!"
        fi
        if [ "$battery_info" -le 10 ]; then
            notify-send -u critical "严重警告" "电量不足10%,请立即充电!"
        fi
    fi
    sleep 60
done
display_battery() {
    local percent=$1
    local filled=$((percent / 10))
    local empty=$((10 - filled))
    echo -n "["
    for ((i=0; i<filled; i++)); do echo -n "█"; done
    for ((i=0; i<empty; i++)); do echo -n "░"; done
    echo "] $percent%"
}

macOS 脚本

#!/bin/bash
# 电池监控脚本 (macOS)
while true; do
    # 获取电池电量
    battery_level=$(ioreg -l | awk '$10 ~ /MaxCapacity/ {capacity = $10}
        $10 ~ /CurrentCapacity/ {current = $10}
        END {printf "%.0f%%", current/capacity*100}')
    # 获取充电状态
    charging_status=$(ioreg -r -k AppleRawCurrentCapacity -d1 | grep -i "ExternalConnected" | awk '{print $NF}')
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 电量: $battery_level | 充电状态: $charging_status"
    # 检查电量并通知
    battery_num=${battery_level%\%}
    if [[ "$charging_status" == "No" ]]; then
        if [ "$battery_num" -le 20 ]; then
            osascript -e 'display notification "电量不足,请充电" with title "电池警告"'
        fi
        if [ "$battery_num" -le 10 ]; then
            osascript -e 'display notification "电量严重不足!" with title "严重警告" sound name "Glass"'
        fi
    fi
    sleep 60
done

使用方法

Python版本(推荐)

# 安装依赖
pip install psutil
# 基本使用
python battery_monitor.py
# 自定义参数
python battery_monitor.py -w 30 -c 10 -i 120
# 参数说明:
# -w: 警告阈值 (默认20%)
# -c: 严重警告阈值 (默认10%)
# -i: 检查间隔秒数 (默认60秒)

设置开机自启动(可选)

Windows 计划任务:

# 创建计划任务
schtasks /create /tn "BatteryMonitor" /tr "python ${PWD}\battery_monitor.py" /sc onstart

Linux 服务:

# 创建systemd服务
sudo nano /etc/systemd/system/battery-monitor.service
[Unit]
Description=Battery Monitor
[Service]
ExecStart=/usr/bin/python3 /path/to/battery_monitor.py
Restart=always
[Install]
WantedBy=multi-user.target
# 启用服务
sudo systemctl enable battery-monitor
sudo systemctl start battery-monitor

功能特点

  1. 实时监控:持续监控电池状态
  2. 多级警告:支持警告和严重警告阈值
  3. 跨平台:Python版本支持所有主流系统
  4. 系统通知:发送系统级通知提醒
  5. 自定义配置:可调整各参数

需要我添加其他功能吗?比如日志记录、远程通知(邮件/微信/Telegram)等?

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