Share via


Suspend-Computer (a.k.a. Sleep)

Shutdown.exe hibernates a computer, but there's no easy way to put a computer to sleep.  One possible reason is that shutdown.exe’s /s, /l, and /e flags are already defined, and /p isn’t the most intuitive mnemonic for’ ‘sleep’.  Maybe /zzzz?

https://www.teachnovice.com/1499/command-to-use-to-put-computer-to-sleep-not-hibernate

shows the magic to be

 [System.Windows.Forms.Application]::SetSuspendState("Suspend", $false, $true);

but I don't want to put any of my lab machines to sleep. (We have sideband management via iLO, but it’s a pain to use.) I’ve added a simple check against the Win32_OperatingSystem Caption property to be sure it doesn’t include the string ‘ Server ‘.

 function Suspend-Computer
{
    <#
    .synopsis
    Sleep a computer 
     .description
    Calls 
        [System.Windows.Forms.Application]::SetSuspendState("Suspend", $false, $true);
    to put the local computer to sleep.  Will not work on Server OS, defined as
        (Get-WmiOnject -Class Win32_OperatingSystem).Caption -match ' Server ';
    .References
https://www.teachnovice.com/1499/command-to-use-to-put-computer-to-sleep-not-hibernate
     #> 
     if ((Get-WmiObject -Class Win32_OperatingSystem).Caption -match '\sServer\s')
    {
        $msg = "$($MyInvocation.MyCommand.Name) will not work on Server OS";
        Write-Error -ErrorAction SilentlyContinue -Message $msg;
        Write-Warning "$msg"; 
     } # if ((Get-WmiObject -Class Win32_OperatingSystem).Caption -match '\sServer\s')
    else
    {
        Add-Type -Assembly System.Windows.Forms;
        [System.Windows.Forms.Application]::SetSuspendState("Suspend", $false, $true); 
     } # if ((Get-WmiObject -Class Win32_OperatingSystem).Caption -match '\sServer\s')... else 
 } # function Suspend-Computer