【问题标题】:Changing Power Plans using PowerShell使用 PowerShell 更改电源计划
【发布时间】:2018-10-18 10:32:17
【问题描述】:

我正在尝试创建一个在电源计划之间切换的脚本。这是脚本:

$PP1 = Get-WmiObject -Namespace root\cimv2\power -Class Win32_PowerPlan |
           where {$_.elementname -eq "Balanced"}
$PP2 = Get-WmiObject -Namespace root\cimv2\power -Class Win32_PowerPlan |
       where {$_.elementname -eq "My Custom Plan 1"}

if ($PP1) {
    $PP2.Activate()
}
if ($PP2) {
    $PP1.Activate()
}

这是我得到的错误:

异常调用“激活”:“此方法未在任何类中实现” 在行:6 字符:1 + $PP2.Activate() +~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException +fullyQualifiedErrorId:WMIMethodException 异常调用“激活”:“此方法未在任何类中实现” 在行:10 字符:1 + $PP1.Activate() +~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException +fullyQualifiedErrorId:WMIMethodException

知道如何解决这个问题吗?

下面是我执行$PP1后得到的输出。输出与$PP2 相同:

__属:2 __CLASS : Win32_PowerPlan __SUPERCLASS : CIM_SettingData __DYNASTY : CIM_ManagedElement __RELPATH : Win32_PowerPlan.InstanceID="Microsoft:PowerPlan\\{381b4222-f694-41f0-9685-ff5bb260df2e}" __PROPERTY_COUNT : 5 __DERIVATION : {CIM_SettingData, CIM_ManagedElement} __服务器:PCLP2 __NAMESPACE : 根\cimv2\power __PATH : \\PCLP2\root\cimv2\power:Win32_PowerPlan.InstanceID="Microsoft:PowerPlan\\{381b4222-f694-41f0-9685-ff5bb260df2e }" 标题 : 描述:在有能力的硬件上自动平衡性能和能耗。 元素名称:平衡 InstanceID : Microsoft:PowerPlan\{381b4222-f694-41f0-9685-ff5bb260df2e} IsActive : 真 PS计算机名称:PCLP2

我的目标是将脚本添加到任务计划程序中,每次我锁定计算机时,电源状态都会相应地切换。

【问题讨论】:

  • 无法复制。您是否检查了 $PP1$PP2 的值是否符合您的预期?
  • 我编辑了上面的问题,显示了我在PP1$PP2 之后得到的值
  • 当您执行$PP1 | Get-Member 时,您是否看到方法Activate()?您的对象的实际类型是什么?
  • 是的,抱歉,但我不确定“您的对象的实际类型是什么?”是什么意思,但我在 MemberType 下得到方法“激活”
  • 对象类型显示在Get-Member 输出的最顶部。以TypeName: 开头的行。无论如何,如果您确实看到了一个方法 Activate 但仍然得到您描述的错误,那么还有其他问题。尝试通过从 CMD 窗口或“运行”对话框运行 powershell.exe -NoExit -NoProfile 来启动干净的 PowerShell 控制台。在该控制台中运行代码时,您是否仍然收到错误消息?

标签: powershell powershell-5.0 powershell-ise


【解决方案1】:

我认为你与这段代码有关

$PP1 = Get-WmiObject -Namespace root\cimv2\power -Class Win32_PowerPlan -Filter "ElementName ='Balanced'"
$PP2 = Get-WmiObject -Namespace root\cimv2\power -Class Win32_PowerPlan -Filter "ElementName = 'Power saver'"
if ($PP1.IsActive -eq "true"){
write-host Balanced
$PP2.Activate()
}
else{
Write-Host Power saver
}

祝你好运

【讨论】:

  • 仍然收到Exception calling "Activate" : "This method is not implemented in any class " 错误,我正在尝试找出为什么我不断收到该错误。
【解决方案2】:

我发现此方法在 Windows 10 上由于某种我不知道确切原因的原因不起作用,所以我只是使用 powercfg 命令来解决这个问题,这是一个工作脚本。

$PP1 = Get-WmiObject -Namespace root\cimv2\power -Class win32_powerplan | where {$_.elementname -eq "Balanced"}


if ($PP1.IsActive -eq "False") {
powercfg /setactive 47f02214-4297-464e-8b31-f95e26d28082 
} Else { 

powercfg /setactive 381b4222-f694-41f0-9685-ff5bb260df2e
} 

由于我只有 2 个电源计划,这越来越简单,这就是为什么我有 1 个变量,它只能是 PowerPlan A 或 PowerPlan B。

不确定如何在任务计划程序上进行这项工作,因为如果我运行该任务,它会为我打开一个记事本,尽管我可以使用带有 powercfg 命令的 bat 文件来完成这项工作,但只是好奇。 有什么办法可以做到这一点?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    相关资源
    最近更新 更多