forderud / BatterySimulator

Driver to simulate multi-battery setups and test Windows power management
MIT License
13 stars 1 forks source link

Powershell power settings example #36

Closed forderud closed 5 days ago

forderud commented 5 days ago

Goal: Demonstrate programmatic access to Windows power settings from a PowerShell script.

Possible use-case: Detect and list differences in AC vs. DC power settings.

Sample code:

# PowerShell script must run as admin
$ErrorActionPreference = "Stop"

# Get current power plan (Balanced, High performance, Power saver, ..)
$powerplan = Get-WmiObject -Namespace "root\cimv2\power" -Class Win32_powerplan | where {$_.IsActive}

$settings = $powerplan.GetRelated("Win32_PowerSettingDataIndex")
foreach ($settingidx in $settings) {
    # will iterate over S0_AC, S0_DC, S1_AC, S1_DC, S2_AC, S2_DC, ...
    $acdc = $settingidx.InstanceID.split("\")[2] # determine if AC or DC setting
    if ($acdc -eq "AC") {
        $acValue = $settingidx.SettingIndexValue
        $acID = $settingidx.InstanceID.split("\")[3]
        continue # corresponding DC value will come in next iteration
    } else {
        $dcValue = $settingidx.SettingIndexValue
        $dcID = $settingidx.InstanceID.split("\")[3]
    }

    if ($acID -ne $dcID) { # sanity check
        Write-Error "AC vs. DC InstanceID mismatch"
        Exit
    }

    $setting = $settingidx.GetRelated("Win32_PowerSetting")
    Write-Host
    Write-Host ID: $setting.InstanceID
    Write-Host Name: $setting.ElementName
    Write-Host Description: $setting.Description
    Write-Host AC value: $acValue
    Write-Host DC value: $dcValue

    # modify DC settings to match AC
    $settingidx.SettingIndexValue = $acValue
    [void]$settingidx.Put() # store

    #break
}

Link with sample script from Microsoft: https://learn.microsoft.com/en-us/previous-versions/windows/desktop/powerwmiprov/win32-powersetting

forderud commented 5 days ago

Script moved to https://github.com/forderud/BatterySimulator/blob/main/PowerSettings.ps1