14

ログインするたびにGPOを介してリセットされるため、仕事用ラップトップのふたが閉じられたときにWindows 7が実行するアクションの設定を自動化したかったのです。

これを実現するには、バッチ スクリプトで powercfg コマンドを使用できることを知っています。

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

ただし、これは、いくつかの PowerShell を学習しようとする良い口実でした。最初の試行では、実行に 10 秒以上かかります。

ランタイムとコードのクリーンさの両方の観点から、以下を改善するにはどうすればよいですか。以下にアプローチするための慣用的なパワーシェルの方法は何でしょうか?

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

8 に答える 8

5

正直なところ、単純に機能するツールを使用してはならない理由がわかりません... ;) とにかく: 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 クエリを使用するより良い方法があるかもしれません。これは、少し変更しただけで、ほとんど同じです。

于 2013-03-17T17:24:12.937 に答える
5

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()
于 2013-03-17T08:27:08.873 に答える
5

同じことをやりたかったのですが、まったく同じ問題が発生しました。最後に、変更したいレジストリ キーよりも優れたレジストリ キーをコマンド ラインに挿入する必要があることがわかりました。

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 ファイルに入れるだけで、準備完了です。

于 2014-02-07T18:11:55.923 に答える
3

このちょっとした PowerShell は、実際にはレジストリ設定を変更しますが、蓋を閉じたときのラップトップの動作は変更しません。Usingpowercfgは、この WMI オブジェクトと同じことを行います。

どうやら、レジストリ サブ グループPowerButtons and Lidには 2 つの異なるレジストリ エントリ セットがあります。

このスクリプト、および 内の同一のコマンドはpowercfg、このサブ グループをPower Options >> Advanced SettingsDo 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サブグループで機能するものが見つかりません。

于 2013-12-17T14:01:59.007 に答える
3

私が 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."
于 2015-02-22T23:54:01.507 に答える