Как изменить план питания в Windows 10 с помощью Powershell и вернуться после долгого сценария к исходным настройкам?

Как я могу сделать сценарий PowerShell для проверки текущего плана питания, изменить его на высокую производительность (если он еще не установлен), затем запустить длинный сценарий PowerShell, а затем после сценария вернуться к исходному плану питания?

Я придумал что-то подобное, но мне кажется, что операторы -and не работают, или я делаю что-то ужасно неправильно?

У меня на данный момент получилось следующее:

$PowerSettingsorg = Get-WmiObject -Namespace root\cimv2\power -Class win32_powerplan
$PowerSettings = Get-WmiObject -Namespace root\cimv2\power -Class win32_powerplan


If ($PowerSettings.IsActive -eq $True -And $PowerSettings.ElementName -eq 'Hoge prestaties') 
{ 
write-host "++ Power Plan Settings are correct.!" 
}

Else {
$hpPlan = Get-WmiObject -Namespace root\cimv2\power -Class win32_powerplan | Where-Object { $_.ElementName -eq 'Hoge prestaties' } 
$hpPlan.Activate()
write-host "++ Power plan Settings are changed to High Performance.!"
}

<Long Script here>


If ($PowerSettingsorg.IsActive -eq 'true' -and $PowerSettingsorg.ElementName -eq 'Gebalanceerd')
{
$orgPlan = Get-WmiObject -Namespace root\cimv2\power -Class win32_powerplan | Where-Object { $_.ElementName -eq 'Gebalanceerd' } 
$orgPlan.Activate()
write-host "++ Power plan Settings have been reverted to Belanced.!"
}
Else {
write-host "++ No Power Plan settings have been reverted.!"
}

person Dennis    schedule 08.04.2020    source источник
comment
Попробуйте заключить в скобки компараторы AND: ($PowerSettings.IsActive -And ($PowerSettings.ElementName -eq 'Hoge prestaties')   -  person Scepticalist    schedule 08.04.2020
comment
Он продолжает утверждать, что это $ True, в то время как мой план питания находится в состоянии Balanced: If ($ PowerSettings.IsActive -And ($ PowerSettings.ElementName -eq 'Hoge prestaties')) я ожидаю, что это будет ложь:/   -  person Dennis    schedule 08.04.2020
comment
У меня работает нормально. Вы уверены, что имя элемента указано на региональном языке? Что вы получите, если наберете $PowerSettings.ElementName?   -  person Scepticalist    schedule 08.04.2020
comment
- Gebalanceerd - Hoge prestaties - Energiebesparing Мне кажется правильным?   -  person Dennis    schedule 08.04.2020


Ответы (3)


В Windows 10 метод Activate() для COM-объекта больше не работает, выдавая сообщение об ошибке Exception calling "Activate" : "This method is not implemented in any class ".

Для управления настройками схемы питания вам придется использовать PowerCfg.exe:

# fill a hashtable with power scheme guids and alias names:

# Name                                   Value
# -----                                  -----
# 381b4222-f694-41f0-9685-ff5bb260df2e   SCHEME_BALANCED  # --> Balanced
# 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c   SCHEME_MIN       # --> High performance
# a1841308-3541-4fab-bc81-f71556f20b4a   SCHEME_MAX       # --> Power saver

$powerConstants = @{}
PowerCfg.exe -ALIASES | Where-Object { $_ -match 'SCHEME_' } | ForEach-Object {
    $guid,$alias = ($_ -split '\s+', 2).Trim()
    $powerConstants[$guid] = $alias
}

# get a list of power schemes
$powerSchemes = PowerCfg.exe -LIST | Where-Object { $_ -match '^Power Scheme' } | ForEach-Object {
    $guid = $_ -replace '.*GUID:\s*([-a-f0-9]+).*', '$1'
    [PsCustomObject]@{
        Name     = $_.Trim("* ") -replace '.*\(([^)]+)\)$', '$1'          # LOCALIZED !
        Alias    = $powerConstants[$guid]
        Guid     = $guid
        IsActive = $_ -match '\*$'
    }
}

# set a variable for the desired power scheme (in this case High performance)
$desiredScheme = $powerSchemes | Where-Object { $_.Alias -eq 'SCHEME_MIN' }

# get the currently active scheme
$PowerSettingsorg = $powerSchemes | Where-Object { $_.IsActive }

if ($PowerSettingsorg.Alias -eq $desiredScheme.Alias) {
    # or by guid:   if ($PowerSettingsorg.Guid -eq $desiredScheme.Guid)
    # or localized: if ($PowerSettingsorg.Name -eq $desiredScheme.Name)
    # or:           if ($desiredScheme.IsActive)
    Write-Host "++ Power Plan Settings are correct.! ($($PowerSettingsorg.Name))"
}
else {
    # set powersettings to High Performance
    Powercfg.exe -SETACTIVE $desiredScheme.Alias  # you can also set this using the $desiredScheme.Guid
    # test if the setting has changed
    $currentPowerGuid = (Powercfg.exe -GETACTIVESCHEME) -replace '.*GUID:\s*([-a-f0-9]+).*', '$1'
    if ($currentPowerGuid -eq $desiredScheme.Guid) {
        Write-Host "++ Power plan Settings have changed to $($desiredScheme.Name).!"
    }
    else {
        # exit the script here???
        Throw "++ Power plan Settings did not change to $($desiredScheme.Name).!"
    }
}

### <Long Script here> ###


# get the current power scheme and test if it needs to be reverted
if ($currentPowerGuid -ne $PowerSettingsorg.Guid) {
    # set powersettings to the original scheme
    Powercfg.exe -SETACTIVE $PowerSettingsorg.Alias  # you can also set this using the $PowerSettingsorg.Guid
    # test if the setting has changed
    $currentPowerGuid = (Powercfg.exe -GETACTIVESCHEME) -replace '.*GUID:\s*([-a-f0-9]+).*', '$1'
    if ($currentPowerGuid -eq $PowerSettingsorg.Guid) {
        Write-Host "++ Power plan Settings have been reverted to $($PowerSettingsorg.Name).!"
    }
    else {
        # exit the script here???
        Throw "++ Power plan Settings did not revert to $($PowerSettingsorg.Name).!"
    }
}
else {
    Write-Host "++ Power Plan settings did not need to be reverted.!"
}
person Theo    schedule 09.04.2020
comment
Спасибо за комментарий приятель. Активация работает просто отлично :) Исправлено с ответом выше. Большое спасибо! - person Dennis; 09.04.2020
comment
@Dennis Activate() не работает на моей машине (Windows 10 Pro 1909, сборка 18363.720) и выдает ошибку "This method is not implemented in any class ". - person Theo; 09.04.2020

Итак, это мое исправление, так как метод .Activate() таинственным образом исчез в более новых версиях PS:

Старый способ с использованием метода Activate и CIM

$p = Get-CimInstance -Name root\cimv2\power -Class win32_PowerPlan -Filter "ElementName = 'High Performance'"      
Invoke-CimMethod -InputObject $p -MethodName Activate

Новый способ использования powercfg для установки выбранного плана

$p = Get-CimInstance -Name root\cimv2\power -Class win32_PowerPlan -Filter "ElementName = 'High Performance'"      
powercfg /setactive ([string]$p.InstanceID).Replace("Microsoft:PowerPlan\{","").Replace("}","")
person chris85    schedule 05.06.2020

Ваша переменная $PowerSettings содержит настройки для всех трех планов электропитания. Вам нужно проверить, какой план активен.

$PowerSettings = Get-WmiObject -Namespace root\cimv2\power -Class win32_powerplan
($PowerSettings | Where-Object { $_.IsActive }).ElementName
person Scepticalist    schedule 08.04.2020
comment
Что я делаю при поиске объекта: IsActive $true. ($PowerSettings.IsActive -eq $true -And ($PowerSettings.ElementName -eq 'Предустановки Hoge')) Тем не менее, хотя схема сбалансированного питания активна, она дает мне результат как истинный. С каких это пор High Performance такой же, как и Balanced в активной схеме? - person Dennis; 09.04.2020
comment
Ты был прав! Я отредактировал чек и теперь все работает как положено! - person Dennis; 09.04.2020