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?

http://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
http://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