Приостановка или спящий режим от PowerShell

Я заинтересован в использовании Windows PowerShell для приостановки или спящего режима на компьютере. Как вы это достигаете?

Я уже знаю о командлетах Stop-Computer и Restart-Computer, которые включены в комплект поставки, но они не обеспечивают функциональности, которой я пользуюсь.

Ответ 1

Для этого вы можете использовать метод SetSuspendState в классе System.Windows.Forms.Application. Метод SetSuspendState является статическим методом.

[MSDN] SetSuspendState

Существует три параметра:

  • Состояние [System.Windows.Forms.PowerState]
  • Force [bool]
  • disableWakeEvent [bool]

Чтобы вызвать метод SetSuspendState:

# 1. Define the power state you wish to set, from the
#    System.Windows.Forms.PowerState enumeration.
$PowerState = [System.Windows.Forms.PowerState]::Suspend;

# 2. Choose whether or not to force the power state
$Force = $false;

# 3. Choose whether or not to disable wake capabilities
$DisableWake = $false;

# Set the power state
[System.Windows.Forms.Application]::SetSuspendState($PowerState, $Force, $DisableWake);

Включение этого в более полную функцию может выглядеть примерно так:

function Set-PowerState {
    [CmdletBinding()]
    param (
          [System.Windows.Forms.PowerState] $PowerState = [System.Windows.Forms.PowerState]::Suspend
        , [switch] $DisableWake
        , [switch] $Force
    )

    begin {
        Write-Verbose -Message 'Executing Begin block';

        if (!$DisableWake) { $DisableWake = $false; };
        if (!$Force) { $Force = $false; };

        Write-Verbose -Message ('Force is: {0}' -f $Force);
        Write-Verbose -Message ('DisableWake is: {0}' -f $DisableWake);
    }

    process {
        Write-Verbose -Message 'Executing Process block';
        try {
            $Result = [System.Windows.Forms.Application]::SetSuspendState($PowerState, $Force, $DisableWake);
        }
        catch {
            Write-Error -Exception $_;
        }
    }

    end {
        Write-Verbose -Message 'Executing End block';
    }
}

# Call the function
Set-PowerState -PowerState Hibernate -DisableWake -Force;

Примечание. В моем тестировании опция -DisableWake не отличалась различимой разницей, о которой я знаю. Я все еще мог использовать клавиатуру и мышь, чтобы разбудить компьютер, даже когда этот параметр был установлен в значение $true.

Ответ 2

Надеюсь, вы найдете их полезными.

Завершение работы %windir%\System32\shutdown.exe -s

Перезагрузка %windir%\System32\shutdown.exe -r

Выход из системы %windir%\System32\shutdown.exe -l

Standby %windir%\System32\rundll32.exe powrprof.dll,SetSuspendState Standby

Hibernate %windir%\System32\rundll32.exe powrprof.dll,SetSuspendState Hibernate

EDIT: Как указано в комментарии @mica, приостановление (сон) фактически спящий. Видимо, это происходит в окнах 8 и выше. Чтобы "спать", отключите спящий режим или получите внешний инструмент Microsoft (не встроенный). "Одним из инструментов Microsoft Sysinternals является PsShutdown с помощью команды psshutdown -d -t 0 она будет правильно спать, а не спящий режим, компьютер" Источник: https://superuser.com/questions/42124/how-can-i-put-the-computer-to-sleep-from-command-prompt-run-menu

Ответ 3

Я использую исполняемый файл shutdown в C:\Windows\System32

shutdown.exe /h

Ответ 4

Я пытался свести это к одной строке, но получал ошибку. Вот мое решение:

[Void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
[System.Windows.Forms.Application]::SetSuspendState("Hibernate", $false, $false);