Как заставить компьютер с Win11 выключаться, а не засыпать.

Понадобилось мне сделать так, что бы компьютер с Win11 не засыпал, а выключался полностью и оказалось, что сделать это не так просто. 

Первый шаг - запретить засыпать: идём по пути Control Panel\Hardware and Sound\Power Options\Edit Plan Settings и ставим всё как на картинке:

po 01

Открываем планировщик, для этого нажимаем "Старт" и в поиск вставляем taskschd.msc, делаем новую задачу - нажимаем Create task... дальше ставим всё как на картинках:
po 04В Program/script: нужно вставить wscript.exe, в аргументы вот это: "C:\Scripts\RunHidden.vbs", указать путь на C:\Scripts, в этой директории я храню скрипты, если у вас другой адрес - указать его и исправить путь до скрипта.

po 05
po 06
Что мы сделали: создали задачу, которую планировщик будет запускать каждые пять минут, эта задача будет запускать скрипт на бейзике C:\Scripts\RunHidden.vbs, который лежит и запускается в директории , C:\Scripts\ и теперь нужно сделать этот самый скрипт, вот его содержимое:

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "powershell.exe -NoProfile -ExecutionPolicy Bypass -File ""C:\Scripts\AutoShutdown.ps""", 0, True

Что делает этот бейзик скрипт: он дёргает в фоне!!! скрипт павершелла, C:\Scripts\AutoShutdown.ps, а его содержимое такое:

Add-Type @"
using System;
using System.Runtime.InteropServices;
public class IdleTime
{
[StructLayout(LayoutKind.Sequential)]
struct LASTINPUTINFO
{
public uint cbSize;
public uint dwTime;
}
[DllImport("user32.dll")]
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
public static uint GetIdleSeconds()
{
LASTINPUTINFO lii = new LASTINPUTINFO();
lii.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lii);
GetLastInputInfo(ref lii);
return ((uint)Environment.TickCount - lii.dwTime) / 1000;
}
}
"@
# Время в секундах:
# 300 - 5 минут
# 900 — 15 минут
# 1800 — 30 минут
# 3600 — 1 час
# 7200 — 2 часа
if ([IdleTime]::GetIdleSeconds() -ge 7200)
{
Stop-Computer -Force
}

А вот этот скрипт уже смотрит сколько времени машина бездействует и выключает, если порог времени превышен. Подсказка по времени в комментариях, нужное число вставить. Но нужно учитывать, что обязательно будет ошибка менее пяти минут - скрипт у нас запускается с интервалом пять минут.

На этом месте хочется спросить, а зачем промежуточный скрипт на бейзике, почему не запускать сразу скрипт в повершелле, верно? Дело в том, что если запускать напрямую, то каждые пять минут выскакивает и сразу пропадает окно, на которое улетает фокус мышки, и вообще мне это мелькание не нравится, поэтому я подставил такой костыль, не знаю как сделать правильно.