用脚本实现自定义电源计划

wen 实用脚本 1
<#
.SYNOPSIS
    自定义电源计划管理脚本
.DESCRIPTION
    此脚本用于创建、切换和管理 Windows 电源计划。
    支持创建基于“平衡”计划的自定义计划,或直接切换系统已有计划。
.PARAMETER Action
    指定操作类型:Create, Switch, List, Current
.PARAMETER Name
    自定义电源计划的名称(创建或切换时使用)
.PARAMETER Description
    自定义电源计划的描述(仅创建时使用)
.EXAMPLE
    .\PowerPlanManager.ps1 -Action List
    列出所有电源计划
.EXAMPLE
    .\PowerPlanManager.ps1 -Action Current
    显示当前激活的电源计划
.EXAMPLE
    .\PowerPlanManager.ps1 -Action Create -Name "我的高性能计划" -Description "自定义高性能配置"
    基于平衡计划创建名为“我的高性能计划”的自定义计划
.EXAMPLE
    .\PowerPlanManager.ps1 -Action Switch -Name "我的高性能计划"
    切换到指定名称的电源计划
.NOTES
    作者: AI 助手
    需要管理员权限才能创建或切换电源计划。
#>
[CmdletBinding()]
param (
    [Parameter(Mandatory = $true, Position = 0)]
    [ValidateSet('Create', 'Switch', 'List', 'Current')]
    [string]$Action,
    [Parameter(Position = 1)]
    [string]$Name,
    [Parameter(Position = 2)]
    [string]$Description = "由脚本创建的自定义电源计划"
)
# 检查管理员权限
$isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
# 辅助函数:获取所有电源计划
function Get-PowerPlans {
    $plans = powercfg /list | Select-String -Pattern "^(?:现有电源方案|现有电源计划)\s*\*\s*|^(?:电源方案|电源计划)\s*\*?\s*" -NotMatch
    # 兼容中英文输出
    $plans = powercfg /list | ForEach-Object {
        if ($_ -match '([a-f0-9\-]{36})\s+\((.*?)\)') {
            [PSCustomObject]@{
                Guid = $matches[1]
                Name = $matches[2].Trim()
                IsActive = $_ -match '^\s*\*'
            }
        }
    }
    return $plans
}
# 辅助函数:通过名称查找电源计划 GUID
function Get-PlanGuidByName {
    param([string]$planName)
    $plans = Get-PowerPlans
    $match = $plans | Where-Object { $_.Name -eq $planName }
    if ($match) {
        return $match[0].Guid
    }
    # 尝试模糊匹配
    $fuzzy = $plans | Where-Object { $_.Name -like "*$planName*" }
    if ($fuzzy) {
        Write-Warning "未找到完全匹配的计划,但找到模糊匹配: '$($fuzzy[0].Name)',将使用此计划。"
        return $fuzzy[0].Guid
    }
    return $null
}
# 根据操作执行
switch ($Action) {
    'List' {
        Write-Host "`n=== 系统电源计划列表 ===" -ForegroundColor Cyan
        $plans = Get-PowerPlans
        if (-not $plans) {
            Write-Warning "未找到任何电源计划。"
        } else {
            $plans | ForEach-Object {
                $activeFlag = if ($_.IsActive) { " (当前激活)" } else { "" }
                Write-Host "  $($_.Name)$activeFlag" -ForegroundColor $(
                    if ($_.IsActive) { 'Green' } else { 'White' }
                )
                Write-Host "    GUID: $($_.Guid)" -ForegroundColor Gray
            }
        }
        break
    }
    'Current' {
        Write-Host "`n=== 当前激活的电源计划 ===" -ForegroundColor Cyan
        $plans = Get-PowerPlans
        $active = $plans | Where-Object { $_.IsActive }
        if ($active) {
            Write-Host "  名称: $($active.Name)" -ForegroundColor Green
            Write-Host "  GUID : $($active.Guid)" -ForegroundColor Gray
        } else {
            Write-Warning "无法确定当前电源计划。"
        }
        break
    }
    'Create' {
        if (-not $isAdmin) {
            Write-Error "创建电源计划需要管理员权限,请以管理员身份运行此脚本。"
            exit 1
        }
        if (-not $Name) {
            Write-Error "创建计划时必须指定 -Name 参数。"
            exit 1
        }
        # 检查是否已存在同名计划
        $existing = Get-PlanGuidByName -planName $Name
        if ($existing) {
            Write-Warning "已存在名为 '$Name' 的电源计划 (GUID: $existing)。"
            $confirm = Read-Host "是否仍要创建? (y/N, 默认 N)"
            if ($confirm -ne 'y' -and $confirm -ne 'Y') {
                Write-Host "操作已取消。" -ForegroundColor Yellow
                exit 0
            }
        }
        Write-Host "`n正在创建自定义电源计划: $Name" -ForegroundColor Cyan
        Write-Host "描述: $Description" -ForegroundColor Gray
        # 获取平衡计划的 GUID (首选 GUID: 381b4222-f694-41f0-9685-ff5bb260df2e)
        $balancedGuid = "381b4222-f694-41f0-9685-ff5bb260df2e"
        $balancedPlan = Get-PowerPlans | Where-Object { $_.Guid -eq $balancedGuid }
        if (-not $balancedPlan) {
            # 如果标准 GUID 不存在,尝试查找名称包含 "平衡" 的计划
            $balancedPlan = Get-PowerPlans | Where-Object { $_.Name -match '平衡|Balanced' } | Select-Object -First 1
        }
        if (-not $balancedPlan) {
            Write-Error "无法找到“平衡”电源计划 (GUID: $balancedGuid),请检查系统。"
            exit 1
        }
        Write-Host "基于计划: $($balancedPlan.Name) ($($balancedPlan.Guid))" -ForegroundColor Green
        # 创建新计划 (复制平衡计划)
        $createOutput = powercfg /duplicatescheme $balancedPlan.Guid 2>&1
        if ($LASTEXITCODE -ne 0) {
            Write-Error "复制电源计划失败: $createOutput"
            exit 1
        }
        # 从输出中提取新 GUID (输出格式类似: "电源方案 GUID: xxxxxx 已复制...")
        $newGuid = $null
        if ($createOutput -match '([a-f0-9\-]{36})') {
            $newGuid = $matches[1]
        }
        if (-not $newGuid) {
            # 如果无法从输出提取,尝试从列表获取最新的计划(通常新计划排在最后)
            Start-Sleep -Milliseconds 200
            $allPlans = Get-PowerPlans
            $newPlan = $allPlans | Where-Object { $_.Name -notin @('高性能', '平衡', '节能', 'High performance', 'Balanced', 'Power saver') -and $_.Name -ne $balancedPlan.Name } | Select-Object -Last 1
            if ($newPlan) {
                $newGuid = $newPlan.Guid
            }
            else {
                Write-Error "无法自动获取新创建的电源计划 GUID,请手动检查。"
                exit 1
            }
        }
        # 重命名并设置描述
        powercfg /changename $newGuid $Name $Description | Out-Null
        if ($LASTEXITCODE -eq 0) {
            Write-Host "成功创建自定义电源计划!" -ForegroundColor Green
            Write-Host "  名称: $Name" -ForegroundColor White
            Write-Host "  GUID: $newGuid" -ForegroundColor Gray
        } else {
            Write-Error "重命名电源计划时出错,但计划可能已创建,GUID: $newGuid"
        }
        break
    }
    'Switch' {
        if (-not $isAdmin) {
            Write-Error "切换电源计划需要管理员权限,请以管理员身份运行此脚本。"
            exit 1
        }
        if (-not $Name) {
            Write-Error "切换计划时请指定 -Name 参数(计划名称或部分名称)。"
            exit 1
        }
        $guid = Get-PlanGuidByName -planName $Name
        if (-not $guid) {
            Write-Error "未找到名称为 '$Name' 的电源计划,请使用 -Action List 查看所有计划。"
            exit 1
        }
        Write-Host "正在切换到电源计划: $Name (GUID: $guid)" -ForegroundColor Cyan
        $switchOutput = powercfg /setactive $guid 2>&1
        if ($LASTEXITCODE -eq 0) {
            Write-Host "成功切换到计划: $Name" -ForegroundColor Green
        } else {
            Write-Error "切换失败: $switchOutput"
        }
        break
    }
    default {
        Write-Host "未知操作,可用操作: Create, Switch, List, Current" -ForegroundColor Yellow
    }
}

电源计划管理功能说明

您可以通过四个核心操作来管理电源计划,每个操作都配有清晰的反馈。

用脚本实现自定义电源计划

  • 查看与诊断:使用 ListCurrent 操作可以快速浏览系统所有电源计划及其激活状态,方便您进行决策。
  • 创建自定义计划Create 操作会基于系统内置的“平衡”计划复制一份,并允许您为新计划设置名称和描述,实现个性化配置。
  • 快速切换Switch 操作支持按计划名称或部分名称进行模糊匹配切换,无需记忆复杂的GUID。
  • 权限与安全:脚本在创建或切换计划时会自动检查管理员权限,并在关键操作前进行确认,避免误操作。

优化建议: 您可以根据需要调整 $Description 变量的默认值(第23行),或修改 Create 操作中基于的计划(默认使用“平衡”计划)。

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