<#
.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
}
}
电源计划管理功能说明
您可以通过四个核心操作来管理电源计划,每个操作都配有清晰的反馈。

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