Der Abschaltteil der Frage ist für jeden klar.
shutdown.exe /?
zeigt alle Möglichkeiten zum Abschalten / Neustart / Boot der erweiterten Optionen / Firmware-Boot.
Aber ich sehe so viel Bashing herumgeworfen über den Sleep-Teil.
_Jeder versteht, dass rundll32.exe
nicht verwendet werden sollte, um zufällige Funktionen aufzurufen, und es funktioniert hier für den Winterschlaf ganz zufällig. Aber das ist die Natur von Windows - eine Blackbox, in der die Leute herumgestochert und hunderte von Umgehungsmöglichkeiten gefunden haben, um ihre Arbeit zu erledigen (Rufe nach Dostips).
Es gibt so viele “richtige” Lösungen, die _externe Tools vorschlagen, aber ich scheine kein _einheimisches (hybrides / pinvoke / was auch immer) Batch-Skript finden zu können, auch wenn diese Frage über die Jahre aktiv geblieben ist.
Hier ist also meine einfache * 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
Es funktioniert sogar als großer einzeiliger Befehl:
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();"