Cra*_*rry 11 windows powershell wmi
我希望自动设置Windows 7在我的工作笔记本电脑上关闭盖子时所采取的操作,因为每次登录时都会通过GPO重置.
我知道我可以在批处理脚本中使用powercfg命令来实现这个目的:
powercfg -setacvalueindex 5ca83367-6e45-459f-a27b-476b1d01c936 0
powercfg -setdcvalueindex 5ca83367-6e45-459f-a27b-476b1d01c936 0
Run Code Online (Sandbox Code Playgroud)
然而,这是尝试学习一些PowerShell的一个很好的借口.我的第一次尝试需要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()
Run Code Online (Sandbox Code Playgroud)
尝试 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()
Run Code Online (Sandbox Code Playgroud)
老实说,我不认为您有任何理由不应该使用简单有效的工具...;)无论如何:在使用 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 }
Run Code Online (Sandbox Code Playgroud)
可能有更好的方法来使用更高级的 WQL 查询,这与您所做的几乎相同,只是进行了一些修改。
小智 5
我想做同样的事情,得到完全相同的问题。最后,我发现您需要在命令行中插入优于您要修改的注册表项的注册表项:
powercfg -setacvalueindex 5ca83367-6e45-459f-a27b-476b1d01c936 0
powercfg -setdcvalueindex 5ca83367-6e45-459f-a27b-476b1d01c936 0
Run Code Online (Sandbox Code Playgroud)
应该变成:
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
Run Code Online (Sandbox Code Playgroud)
只需将其放入 BAT 文件中,您就可以开始使用了!
| 归档时间: |
|
| 查看次数: |
14947 次 |
| 最近记录: |