自动切换电源计划的脚本怎么写

wen 实用脚本 4

本文目录导读:

自动切换电源计划的脚本怎么写

  1. Windows PowerShell 脚本(最常用)
  2. 批处理脚本(CMD)
  3. Python 脚本(更灵活)
  4. 任务计划程序配合使用
  5. 高级智能版本
  6. 使用说明

我来为您提供几个不同场景下的自动切换电源计划脚本。

Windows PowerShell 脚本(最常用)

基本版本:根据时间切换

# 自动切换电源计划 - 根据时间段
# 以管理员身份运行
# 获取当前时间
$currentHour = Get-Date -Format "HH"
# 定义电源计划(使用GUID或名称)
$balanced = "平衡"           # 平衡模式
$highPerformance = "高性能"   # 高性能模式
$powerSaver = "节能"          # 节能模式
# 根据时间段切换
if ($currentHour -ge 8 -and $currentHour -lt 18) {
    # 工作时间(8:00-18:00)使用平衡模式
    powercfg /setactive $balanced
    Write-Host "已切换到平衡模式"
} elseif ($currentHour -ge 18 -or $currentHour -lt 22) {
    # 晚间(18:00-22:00)使用高性能
    powercfg /setactive $highPerformance
    Write-Host "已切换到高性能模式"
} else {
    # 深夜(22:00-8:00)使用节能
    powercfg /setactive $powerSaver
    Write-Host "已切到节能模式"
}

进阶版本:根据系统状态切换

# 智能电源计划切换
$batteryThreshold = 20  # 电量低于20%时切换
$cpuLoadThreshold = 30  # CPU使用率阈值
# 获取电源信息
$batteryStatus = (Get-WmiObject Win32_Battery).EstimatedChargeRemaining
# 获取系统是否使用电池
$system = Get-WmiObject -Class Win32_SystemInformation
# 判断是否使用电池
if ($system.PowerSupplies[0].Status -eq "Online") {
    # 使用交流电
    if (Get-Process | Sort-Object CPU | Select-Object -Last 5 | 
        Where-Object {$_.CPU -gt $cpuLoadThreshold}) {
        # 运行重负载程序时
        powercfg /setactive "高性能"
        Write-Host "检测到高负载,使用高性能模式"
    } else {
        # 普通使用
        powercfg /setactive "平衡"
        Write-Host "使用平衡模式"
    }
} elseif ($batteryStatus -lt $batteryThreshold) {
    # 使用电池且电量低
    powercfg /setactive "节能"
    Write-Host "电量低于${batteryThreshold}%,切换到节能模式"
} else {
    # 使用电池但电量充足
    powercfg /setactive "平衡"
    Write-Host "使用电池,保持平衡模式"
}

批处理脚本(CMD)

@echo off电源计划自动切换器
REM 获取当前时间
for /f "tokens=1" %%i in ("%time%") do set time=%%i
set hour=%time:~0,2%
REM 切换电源计划
if %hour% GEQ 8 if %hour% LEQ 18 (
    powercfg /setactive 381b4222-f694-41f0-9685-ff5bb260df2e
    echo 已切换到平衡模式
) else if %hour% GEQ 19 if %hour% LEQ 22 (
    powercfg /setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
    echo 已切换到高性能模式
) else (
    powercfg /setactive a1841308-3541-4fab-bc81-f71556f20b4a
    echo 已切换到节能模式
)
pause

Python 脚本(更灵活)

import os
import time
import subprocess
import psutil
import logging
from datetime import datetime
class PowerPlanManager:
    def __init__(self):
        # 定义电源计划GUID
        self.POWER_PLANS = {
            "balanced": "381b4222-f694-41f0-9685-ff5bb260df2e",
            "high_performance": "8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c",
            "power_saver": "a1841308-3541-4fab-bc81-f71556f20b4a"
        }
        # 设置日志
        logging.basicConfig(
            filename='power_plan.log',
            level=logging.INFO,
            format='%(asctime)s - %(levelname)s - %(message)s'
        )
    def get_battery_status(self):
        """获取电池状态"""
        battery = psutil.sensors_battery()
        if battery:
            return battery.percent, battery.power_plugged
        return None, None
    def set_power_plan(self, plan_name):
        """设置电源计划"""
        if plan_name in self.POWER_PLANS:
            cmd = f'powercfg /setactive {self.POWER_PLANS[plan_name]}'
            result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
            if result.returncode == 0:
                logging.info(f"切换到{plan_name}模式")
                return True
            else:
                logging.error(f"切换失败: {result.stderr}")
                return False
    def smart_switch(self):
        """智能切换逻辑"""
        battery_percent, is_plugged = self.get_battery_status()
        current_hour = datetime.now().hour
        # 基于电池状态
        if not is_plugged and battery_percent and battery_percent < 20:
            return self.set_power_plan("power_saver")
        # 基于时间
        if 8 <= current_hour <= 17:
            return self.set_power_plan("balanced")
        elif 17 < current_hour <= 22:
            return self.set_power_plan("high_performance")
        else:
            return self.set_power_plan("power_saver")
    def run_daemon(self, interval=60):
        """作为守护进程运行"""
        print(f"电源计划管理器启动,每{interval}秒检查一次")
        while True:
            self.smart_switch()
            time.sleep(interval)
if __name__ == "__main__":
    manager = PowerPlanManager()
    manager.run_daemon(interval=300)  # 每5分钟检查一次

任务计划程序配合使用

创建 Windows 任务计划程序自动执行:

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2024-01-01T00:00:00</Date>
    <Author>YourName</Author>
  </RegistrationInfo>
  <Triggers>
    <TimeTrigger>
      <StartBoundary>2024-01-01T08:00:00</StartBoundary>
      <Enabled>true</Enabled>
      <Repetition>
        <Interval>PT1H</Interval>
        <StopAtDurationEnd>false</StopAtDurationEnd>
      </Repetition>
    </TimeTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <RunLevel>HighestAvailable</RunLevel>
      <UserId>Administrator</UserId>
      <LogonType>InteractiveToken</LogonType>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
  </Settings>
  <Actions>
    <Exec>
      <Command>powershell.exe</Command>
      <Arguments>-ExecutionPolicy Bypass -File "C:\Scripts\power_switch.ps1"</Arguments>
    </Exec>
  </Actions>
</Task>

高级智能版本

# 综合智能电源管理脚本
param(
    [int]$CheckInterval = 3000,  # 默认每5秒检查一次
    [switch]$Daemon              # 后台运行模式
)
function Get-SystemLoad {
    # 获取系统负载
    $cpu = (Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples[0].CookedValue
    $memory = (Get-Counter '\Memory\% Committed Bytes In Use').CounterSamples[0].CookedValue
    return @{CPU = $cpu; Memory = $memory}
}
function Switch-PowerPlan {
    param([string]$Plan)
    powercfg /setactive $Plan
    # 记录日志
    $logDate = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    Add-Content -Path "power_switch.log" -Value "$logDate - 切换到 $Plan"
}
function Test-PowerPlan {
    # 获取当前系统状态
    $battery = Get-WmiObject -Class Win32_Battery -ErrorAction SilentlyContinue
    $load = Get-SystemLoad
    $hour = (Get-Date).Hour
    # 决策逻辑
    if ($battery.EstimatedChargeRemaining -lt 15) {
        Switch-PowerPlan "a1841308-3541-4fab-bc81-f71556f20b4a"  # 节能
    }
    elseif ($load.CPU -gt 70) {
        Switch-PowerPlan "8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c"  # 高性能
    }
    elseif ($hour -ge 8 -and $hour -le 18) {
        Switch-PowerPlan "381b4222-f694-41f0-9685-ff5bb260df2e"  # 平衡
    }
    else {
        # 晚上自动关闭屏幕和降低性能
        powercfg /change monitor-timeout-ac 5
        powercfg /change standby-timeout-ac 10
        Switch-PowerPlan "a1841308-3541-4fab-bc81-f71556f20b4a"  # 节能
    }
}
# 主循环
if ($Daemon) {
    while ($true) {
        Test-PowerPlan
        Start-Sleep -Milliseconds $CheckInterval
    }
} else {
    Test-PowerPlan
}

使用说明

  1. 以管理员身份运行:修改电源计划需要管理员权限
  2. 查看当前电源计划:使用 powercfg /list 查看当前所有电源计划
  3. 计划任务:将脚本添加到任务计划程序中来实现自动运行

这些脚本可以根据您的具体需求进行调整,例如修改时间范围、添加特定程序检测等功能。

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