2013-03-16 24 views
7

Volevo automatizzare l'impostazione dell'azione eseguita da Windows 7 quando il coperchio è chiuso sul mio laptop di lavoro, poiché viene reimpostato tramite GPO ogni volta che effettuo l'accesso.Powershell Set Lid Close Azione

So che posso usare il comando powercfg in uno script batch per raggiungere questo obiettivo:

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

Tuttavia, questa è stata una buona scusa per tentare imparare alcune PowerShell. Il mio primo tentativo richiede più di 10 secondi per essere eseguito.

Come posso migliorare sul sotto, sia in termini di runtime & in termini di pulizia del codice. Quale sarebbe il modo idiomatico in powerhell di approcciare il sotto?

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

risposta

2

Prova l'acceleratore 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() 
2

Onestamente, non vedo alcuna ragione per cui non si dovrebbe usare gli strumenti che funzionano semplicemente ...;) In ogni modo: quando si lavora con WMI di solito è una buona idea filtrare il più a sinistra possibile. Non dovrebbe fare molta differenza qui, ma a volte la differenza è enorme. Questo è come lo farei con 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 } 

Ci può essere un modo migliore con richiesta più avanzato WQL, questo è quasi la stessa cosa che hai fatto, solo il bit modificato.

+0

Sembra che non abbia nemmeno bisogno di eseguire una query per powerettingdataindex, solo powerplan. –

2

Questo bit di PowerShell modifica effettivamente le impostazioni del Registro di sistema, ma non modifica il modo in cui i miei laptop si comportano quando il coperchio è chiuso. L'utilizzo di powercfg fa la stessa cosa di questo oggetto WMI.

Apparentemente, il sottogruppo di registro PowerButtons and Lid dispone di 2 set diversi di voci di registro.

Questo script ei comandi identici all'interno powercfg, cambiano questo Gruppo secondaria all'interno Power Options >> Advanced Settings-Do Nothing (o Sleep, o Hibernate, o qualunque numero dell'opzione da 0 - 3 impostato), ma all'interno le impostazioni effettive del pannello di controllo per Change what the power buttons do e Change what closing the lid does non sono interessati. Sono le impostazioni all'interno del Pannello di controllo a dettare le azioni, almeno per questo sottogruppo.

Se utilizzo lo powercfg o uno script PS simile a quanto scritto sopra, posso effettivamente effettuare il Change Plan Settings per ottenere il comportamento desiderato per l'attenuazione della visualizzazione (o qualsiasi altra cosa). Non riesco a trovare nulla che funzioni per il sottogruppo .

2

Volevo fare la stessa cosa e ottenere lo stesso identico problema. Infine, ho trovato che è necessario inserire nella riga di comando le chiavi di registro che sono superiori a quello che si desidera modificare:

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

dovrebbe diventare:

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 

Basta mettere che in un BAT file e sei pronto per andare! Soluzione trovata sul blog di iBoyd (iboyd.net)

1

Cosa ho visto in Windows 8.1 è che quando l'azione del coperchio viene modificata per uno schema di alimentazione, allora lo schema di alimentazione deve essere sia lo schema di alimentazione attivo che quello preferito. Lo schema di potenza attiva può essere impostato da PowerCfg e lo schema di alimentazione preferito può essere impostato dal registro.

Ecco uno script PowerShell per cambiarli e l'azione coperchio:

#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." 
0

Ho trovato questo su una pagina di Microsoft. Chiede il consenso alle condizioni d'uso. Funziona per W10.

https://gallery.technet.microsoft.com/scriptcenter/Quickly-change-the-lid-b78eb77d

lid on (sets to 'do nothing') 
lid off (sets to 'sleep') 

Lo script come pubblicato questa mattina contiene due riferimenti hard coded in c: \ tools. Questi riferimenti servono solo per la registrazione, quindi puoi tranquillamente commentarli o modificarli nella struttura del tuo file.