Controlling the Windows Power Plan with PowerShell
I’ve been using a Windows laptop for presenting while traveling. Yes, it’s heavy. Yes, it’s big. Yes, it’s weird compared to my MacBook. But, it works.
More Power, More Problems
When I’m on a plane, I want to make sure that I’m getting every last drop of power out of the battery. When I’m presenting, I want to power up the CPUs so I’m not getting weird results in demos because of power saving in the CPU. I’m also lazy and, frequently, I don’t have a mouse next to me while I present.
More PowerShell
Thanks to Robert Davis’s post Enabligh High Perofrmance Power Plan via PowerShell, I knew that I could use a pretty simple command to switch the power plan:``` Try { $HighPerf = powercfg -l | %{if($.contains(“High performance”)) {$.split()[3]}} $CurrPlan = $(powercfg -getactivescheme).split()[3] if ($CurrPlan -ne $HighPerf) {powercfg -setactive $HighPerf} } Catch { Write-Warning -Message “Unable to set power plan to high performance” }
### More Modules
I could have created multiple functions in my PowerShell profile, but instead I created a module. The first step, really, was to create a file with a bunch of code in it. After banging around for a while, I came up with:```
function Set-PowerPlan ($powerPlan = "balanced") {
try {
$powerPlan = $powerPlan.toLower()
$perf = powercfg -l | %{if($_.toLower().contains($powerPlan)) {$_.split()[3]}}
$currentPlan = $(powercfg -getactivescheme).split()[3]
if ($currentPlan -ne $perf) {
powercfg -setactive $perf
}
} catch {
Write-Warning -Message "Unabled to set power plan to $powerPlan"
}
}
function Set-PowerSaver {
Set-PowerPlan("power saver")
}
function Set-PowerHighPerformance {
Set-PowerPlan("high performance")
}
function Set-PowerBalanced {
Set-PowerPlan("balanced")
}
```This uses some basic string matching magic to try to match a power plan. I _could_ keep using the`Set-PowerPlan` commandlet to change the power plan, but that's a lot of typing. Since I don't add new power plans to Windows, I created three shortcuts to set the power plan for me.
### Reusing the Module
The basic steps to module re-use are:
1. Create an appropriately named folder in your `Modules` folder. Mine is named `PowerPlan`.
2. Create a file in the module folder. This was also called `PowerPlan.psm1`.
3. Check that the module is available using `Get-Module -ListAvailable`.
4. If available, run `Import-Module PowerPlan`.
If you always want the PowerPlan module loaded, you can added the line `Import-Module PowerPlan` to your PowerShell profile (which defaults ot `Microsoft.PowerShell_profile.ps1`). Once I've imported the module, I just have to open up a PowerShell window and type `Set-Power` and then I can use `TAB` to cycle through the possible completions.