PowerShell设置盖closures行动

我想自动设置Windows 7在我的工作笔记本电脑上closures盖子时所采取的操作,因为每次login时都会通过GPO重置。

我知道我可以在批处理脚本中使用powercfg命令来实现这一点:

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

但是,这是尝试学习Powerhell的一个很好的借口。 我的第一次尝试需要10秒以上运行。

在运行时和代码清洁方面,我如何改进以下内容。 什么是惯用的PowerShell的方式来处理下面?

 $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() 

Solutions Collecting From Web of "PowerShell设置盖closures行动"

试试WMI加速器:

 $class = ([wmi] '\root\cimv2\power:Win32_PowerSettingDataIndex.InstanceID="Microsoft:PowerSettingDataIndex\\{8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c}\\DC\\{5ca83367-6e45-459f-a27b-476b1d01c936}"') $class.SettingIndexValue = 0 $class.Put() 

老实说,我看不出有什么理由不使用简单的工具…;)无论如何:在使用WMI的时候通常是一个好主意,尽可能地向左边过滤。 在这里不应该有太大的区别,但有时差别是巨大的。 这是我将如何与WMI做到这一点:

 $Name = @{ Namespace = 'root\cimv2\power' } $ID = (Get-WmiObject @Name Win32_PowerPlan -Filter "IsActive = TRUE") -replace '.*(\{.*})"', '$1' $Lid = '{5ca83367-6e45-459f-a27b-476b1d01c936}' Get-WmiObject @Name Win32_PowerSettingDataIndex -Filter "InstanceId LIKE '%$Id\\%C\\$Lid'" | Set-WmiInstance -Arguments @{ SettingIndexValue = 0 } 

使用更高级的WQL查询可能会有更好的方式,这与您所做的几乎相同,只是修改了一下。

PowerShell的这一点实际上改变了注册表设置,但是它并没有改变笔记本电脑在关闭盖子时的行为。 使用powercfg与这个WMI对象做同样的事情。

显然,注册表子组PowerButtons and Lid有2套不同的注册表项。

这个脚本和powercfg的相同命令,将Power Options >> Advanced Settings这个子组更改Do Nothing (或者Sleep ,或者Hibernate ,或者你设置的0 - 3任何选项号),但是在实际的控制面板设置Change what the power buttons doChange what closing the lid does不受影响。 这是控制面板中的设置,实际上决定行动,至少对于这个小组。

如果我使用powercfg或类似的PS脚本来写上面的内容,我实际上可以Change Plan Settings来获得调暗显示器(或其他)所需的行为。 我只是找不到任何适用于Power Buttons and Lid组的东西。

我想要做同样的事情,并得到完全相同的问题。 最后,我发现你需要在你的命令行中插入比你想修改的注册表项好的注册表项。

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

应该成为:

 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 

只要把它放在BAT文件中,你就可以开始了! 在iBoyd的博客(iboyd.net)上找到解决方案

我在Windows 8.1中看到的是,当盖子动作改变为电源方案时,那么电源方案必须是主动方案和首选电源方案 。 有功功率方案可以通过PowerCfg设置,首选的功率方案可以通过注册表来设置。

这是一个Powershell脚本来改变它们和盖子的动作:

 #Enable High performance $powerScheme = "High performance" #Find selected power scheme guid $guidRegex = "(\{){0,1}[a-fA-F0-9]{8}-([a-fA-F0-9]{4}-){3}[a-fA-F0-9]{12}(\}){0,1}" [regex]$regex = $guidRegex $guid = ($regex.Matches((PowerCfg /LIST | where {$_ -like "*$powerScheme*"}).ToString())).Value #Change preferred scheme $regGuid = "{025A5937-A6BE-4686-A844-36FE4BEC8B6D}" $currentPreferredScheme = Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\explorer\ControlPanel\NameSpace\$regGuid -Name PreferredPlan if ($currentPreferredScheme.PreferredPlan -ne $guid) { Set-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\explorer\ControlPanel\NameSpace\$regGuid -Name PreferredPlan -Value $guid Write-Host -ForegroundColor Green "Preferred scheme successfully changed. Preferred scheme is now '$powerScheme'." } else { Write-Host -ForegroundColor Yellow "Preferred scheme does not need to be changed. Preferred scheme is '$powerScheme'." } #Change active scheme $currentActiveScheme = PowerCfg /GETACTIVESCHEME if ($currentActiveScheme | where {$_ -notlike "*$guid*"}) { PowerCfg /SETACTIVE $guid Write-Host -ForegroundColor Green "Power scheme successfully changed. Current scheme is now '$powerScheme'." } else { Write-Host -ForegroundColor Yellow "Power scheme does not need to be changed. Current scheme is '$powerScheme'." } #Do not sleep when closing lid on AC PowerCfg /SETACVALUEINDEX $guid SUB_BUTTONS LIDACTION 000 Write-Host -ForegroundColor Green "No action when closing lid on AC."