Powershell Set Lid Close Action

powershell, windows, wmi

Solution

I wanted to do the same thing et get the exact same problem. Finally, I found that you need to insert in your command line the registry keys that are superior to the one you want to modify:

powercfg -setacvalueindex 5ca83367-6e45-459f-a27b-476b1d01c936 0
powercfg -setdcvalueindex 5ca83367-6e45-459f-a27b-476b1d01c936 0

should become:

powercfg -setacvalueindex 381b4222-f694-41f0-9685-ff5bb260df2e 4f971e89-eebd-4455-a8de-9e59040e7347 5ca83367-6e45-459f-a27b-476b1d01c936 0
powercfg -setdcvalueindex 381b4222-f694-41f0-9685-ff5bb260df2e 4f971e89-eebd-4455-a8de-9e59040e7347 5ca83367-6e45-459f-a27b-476b1d01c936 0

Just put that in a BAT file and you're ready to go!

Problem

I wanted to automate setting the action Windows 7 takes when the lid is closed on my work laptop, as this is reset via GPO every time i login. I know that i can use the powercfg command in a batch script to achieve this: ``` powercfg -setacvalueindex 5ca83367-6e45-459f-a27b-476b1d01c936 0 powercfg -setdcvalueindex 5ca83367-6e45-459f-a27b-476b1d01c936 0 ``` However, this was a good excuse to attempt learning some powershell. My first attempt takes over 10 seconds to run. How can i improve on the below, both in terms of runtime & in terms of cleanliness of the code. What would be the idiomatic powershell way to approach the below? ``` $DO_NOTHING = 0 $activePowerPlan = Get-WmiObject -Namespace "root\cimv2\power" Win32_PowerPlan | where {$_.IsActive} $rawPowerPlanID = $activePowerPlan | select -Property InstanceID $rawPowerPlanID -match '\\({.*})}' $powerPlanID = $matches[1] # The .GetRelated() method is an inefficient approach, i'm looking for a needle and this haystack is too big. Can i go directly to the object instead of searching? $lidCloseActionOnACPower = $activePowerPlan.GetRelated("win32_powersettingdataindex") | where {$_.InstanceID -eq "Microsoft:PowerSettingDataIndex\$powerPlanID\AC\{5ca83367-6e45-459f-a27b-476b1d01c936}"} $lidCloseActionOnBattery = $activePowerPlan.GetRelated("win32_powersettingdataindex") | where {$_.InstanceID -eq "Microsoft:PowerSettingDataIndex\$powerPlanID\DC\{5ca83367-6e45-459f-a27b-476b1d01c936}"} $lidCloseActionOnACPower | select -Property SettingIndexValue $lidCloseActionOnACPower.SettingIndexValue = $DO_NOTHING $lidCloseActionOnACPower.put() $lidCloseActionOnBattery | select -Property SettingIndexValue $lidCloseActionOnBattery.SettingIndexValue = $DO_NOTHING $lidCloseActionOnBattery.put() ```

Original source