2013-03-16 11 views
7

Je voulais automatiser la configuration de l'action que Windows 7 prend lorsque le couvercle est fermé sur mon ordinateur portable de travail, car cela est réinitialisé via GPO chaque fois que je me connecte.Powershell Set Lid Close Action

Je sais que je peux utiliser la commande powercfg dans un script batch pour y parvenir:

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

Cependant, ce fut une bonne excuse pour essayer d'apprendre un peu Powershell. Ma première tentative prend plus de 10 secondes à courir.

Comment puis-je améliorer sur le ci-dessous, à la fois en termes d'exécution & en termes de propreté du code. Quelle serait la façon idiomatique powershell d'aborder le dessous?

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

Répondre

2

Essayez l'accélérateur 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

Honnêtement, je ne vois aucune raison pour laquelle vous ne devriez pas utiliser des outils qui fonctionnent tout simplement ...;) Anyways: lorsque vous travaillez avec WMI est généralement une bonne idée de filtrer autant à gauche que vous le pouvez. Cela ne devrait pas faire beaucoup de différence ici, mais parfois la différence est énorme. Voilà comment je le ferais avec 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 } 

Il peut y avoir une meilleure façon avec requête WQL plus avancée, ce qui est presque le même que vous avez fait, que peu modifié.

+0

On dirait qu'il n'a même pas besoin d'interroger pour powersettingdataindex, juste powerplan. –

2

Ce bit de PowerShell modifie réellement les paramètres du registre, mais il ne change pas le comportement de mes ordinateurs portables lorsque le couvercle est fermé. L'utilisation de powercfg fait la même chose que cet objet WMI.

Apparemment, le sous-groupe de registre PowerButtons and Lid possède 2 ensembles différents d'entrées de registre.

Ce script, et les commandes identiques dans powercfg, changer ce groupe secondaire dans Power Options >> Advanced Settings-Do Nothing (ou Sleep, ou Hibernate, ou quel que soit l'option numéro de 0 - 3 que vous définissez), mais dans les paramètres du panneau de commande réels pour Change what the power buttons do et Change what closing the lid does ne sont pas affectés. Ce sont les paramètres du Panneau de configuration qui dictent les actions, au moins pour ce sous-groupe.

Si j'utilise powercfg ou un script PS similaire à ce qui a été écrit ci-dessus, je peux effectivement Change Plan Settings pour obtenir le comportement souhaité pour la gradation de l'affichage (ou autre). Je ne trouve rien qui fonctionne pour le sous-groupe Power Buttons and Lid.

2

Je voulais faire la même chose et obtenir exactement le même problème. Enfin, je trouve que vous devez insérer dans votre ligne de commande les clés de Registre qui sont supérieurs à celui que vous souhaitez modifier:

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

devrait devenir:

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 

Il suffit de le mettre dans un BAT fichier et vous êtes prêt à partir! Solution trouvée sur le blog d'iBoyd (iboyd.net)

1

Ce que j'ai vu dans Windows 8.1 est que lorsque l'action du couvercle est modifiée pour un régime de puissance, alors ce schéma de puissance doit être à la fois le régime d'alimentation actif et préféré. Le schéma d'alimentation actif peut être défini par PowerCfg et le mode d'alimentation préféré peut être défini par le registre.

est ici un script Powershell pour les modifier et l'action du couvercle:

#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

J'ai trouvé sur une page Microsoft. Demande un accord sur les conditions d'utilisation. Fonctionne pour W10.

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

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

Le script a publié ce matin contient deux références codées en dur à c: \ tools. Ces références sont uniquement destinées à la journalisation afin que vous puissiez les commenter ou les modifier en toute sécurité dans la structure de votre fichier.

Questions connexes