Часть вопроса о выключении понятна всем.
shutdown.exe /?
показывает все варианты выключения / перезагрузки / расширенные опции загрузки / загрузки прошивки.
Но я вижу так много баскетбола о Sleep части.
_Все понимают, что rundll32.exe
не следует использовать для вызова случайных функций, и это просто работает здесь в спящем режиме полностью по стечению обстоятельств. Но такова природа Windows - черного ящика, по которому люди копались и находили сотни обходных путей для выполнения работы (кричали о дозировках). _
Есть так много “proper” решений, предлагающих внешние инструменты, но я, кажется, не могу найти native (гибридный / pinvoke / что угодно) пакетный скрипт, даже если этот вопрос оставался активным на протяжении многих лет.
Так что вот моя простая * power_sleep.bat **:
@echo off &mode 32,2 &color cf &title Power Sleep
set "s1=$m='[DllImport ("Powrprof.dll", SetLastError = true)]"
set "s2=static extern bool SetSuspendState(bool hibernate, bool forceCritical, bool disableWakeEvent);"
set "s3=public static void PowerSleep(){ SetSuspendState(false, false, false); }';"
set "s4=add-type -name Import -member $m -namespace Dll; [Dll.Import]::PowerSleep();"
set "ps_powersleep=%s1%%s2%%s3%%s4%"
call powershell.exe -NoProfile -NonInteractive -NoLogo -ExecutionPolicy Bypass -Command "%ps_powersleep:"=\"%"
exit
Он даже работает в виде большой команды из одной строки:
powershell.exe -C "$m='[DllImport(\"Powrprof.dll\",SetLastError=true)]static extern bool SetSuspendState(bool hibernate,bool forceCritical,bool disableWakeEvent);public static void PowerSleep(){SetSuspendState(false,false,false); }';add-type -name Import -member $m -namespace Dll; [Dll.Import]::PowerSleep();"