предотвратить сон в сценариях

12

Есть ли способ предотвратить переход Windows в спящий режим при запуске программы из командной строки или с помощью cygwin? В идеале я надеюсь на что-то, что можно использовать, например:

nosleep myscript.sh

Фон

Иногда я запускаю длительные задания, такие как ручное резервное копирование или передача больших файлов, и обнаружил, что Windows часто переходит в спящий режим до их завершения. Я хотел бы иметь возможность запустить команду и запретить спящий режим во время выполнения команды, но чтобы она автоматически снова работала после выполнения команды.

Мистер Фуз
источник

Ответы:

14

Вы можете использовать powercfgв скрипте, чтобы изменить время ожидания ПК до перехода в спящий режим:

Никогда не переходите в режим ожидания:

powercfg -change -standby-timeout-ac 0

Перейти в режим ожидания через 15 минут:

powercfg -change -standby-timeout-ac 15
harrymc
источник
Благодарю. powercfg плюс немного магии bash - вот что мне нужно.
Мистер Фуз
К сожалению, это стирает предыдущие настройки, и вы должны восстановить их вручную.
Leeroy
8

Вот сценарий bash, который я написал на основании ответа harrymc.

#!/usr/bin/bash

# NAME
#   nosleep - prevent sleep and hibernation while running a command
#
# SYNOPSIS
#   nosleep COMMAND [ARG]...

# Make sure the power scheme gets restored, even if Ctrl-C happens
cleanup()
{
  powercfg -setactive $SCHEME_GUID
  powercfg -delete    $TMP_GUID
  return $?
}
trap cleanup SIGINT

# Disable sleep and hibernate timers
export SCHEME_GUID=`powercfg -getactivescheme | gawk '{ print $4 }'`
export TMP_GUID=`powercfg -duplicatescheme $SCHEME_GUID | gawk '{ print $4 }'`
if [[ -z $TMP_GUID ]]; then
    echo "ERROR: could not duplicate the current power scheme"
    exit 254
fi
powercfg -setactive $TMP_GUID
powercfg -changename $TMP_GUID nosleep "temporary scheme for disabling sleep and hibernation"
powercfg -change -standby-timeout-ac 0
powercfg -change -hibernate-timeout-ac 0

# Run the command
"$@"

powercfg -setactive $SCHEME_GUID
powercfg -delete    $TMP_GUID
Мистер Фуз
источник
На Cygwin мне пришлось убрать цитаты: с "$*"на $*. В противном случае я получил следующее, когда дал более одного аргумента (например $nosleep sleep 1:/usr/bin/nosleep: line 31: sleep 1 command not found
Nippey
1
@Nippey, так и должно быть "$@". "$*"неверно, потому что объединяет все аргументы, а $*неверно, поскольку разделяет аргументы $IFSи удаляет пустые.
щ
Это аккуратно гарантирует, что схема питания восстанавливается, даже если происходит нажатие Ctrl-C, но что было бы еще лучше, так это просто создать запрос на питание, позволяющий компьютеру не спать в течение всего сценария, без постоянного изменения каких-либо настроек. Но, похоже, что нет простого и понятного способа сделать это, чтобы управлять состоянием. Тем не менее, скрытый медиаплеер, играющий тишину, был бы грязным, но простым способом. В AutoHotkey я мог даже избежать использования звука Windows по умолчанию (да, переносимый скрипт). Loop { SoundPlay, %A_WinDir%\Media\ding.wav }без waitаргументов.
Leeroy
2

Теперь nosleepв Cygwin есть такая команда. Просто установите nosleepпакет и запустите как

nosleep myscript.sh

Автор Эндрю Шульман в 2011 году. См. Https://cygwin.com/ml/cygwin/2011-09/msg00151.html.

Источник на Launchpad . Он использует SetThreadExecutionState()(как уже упоминалось, бессонница), не создает отдельную схему питания.

Usage: nosleep [OPTION...] command [args]
Run a command while inhibiting computer sleep or hibernation.

  -a, --awaymode             Force away mode instead of sleep mode
  -d, --display              Keep the display on
  -i, --ifacpower            Following options only apply if AC power is on
  -?, --help                 give this help list
  --usage                give a short usage message
  -V, --version              print program version

Report bugs to the Cygwin mailing list <cygwin@cygwin.com>.

Обратите внимание, что он предотвращает автоматический переход системы в спящий режим, а не переход системы в спящий режим по запросу пользователя (например, при закрытии крышки ноутбука).

сЧ
источник
2

Предложение от этого ответа @LorenzCK на связанный вопрос:

Использовать режим представления из Центра мобильности Windows (если имеется)

%WINDIR%\System32\PresentationSettings.exe "/start"

Проверьте с помощью powercfg -requestsв командной строке. Должен вывести:

DISPLAY:
[PROCESS] \Device\HarddiskVolume2\Windows\System32\PresentationSettings.exe
SYSTEM:
[PROCESS] \Device\HarddiskVolume2\Windows\System32\PresentationSettings.exe

Перевернутый это очищается при выключении или перезапуске. Теперь вам не нужно беспокоиться о сохранении и восстановлении исходных настроек питания 👍

Это также предотвращает переход мониторов в спящий режим, но вы можете сделать это с помощью команды в вашем скрипте. Простые, но сторонние решения: NirCmd nircmd monitor off или AutoHotkey SendMessage, 0x112, 0xF170, 2,, Program Manager Встроенный модульpowercfg /requestsoverride process PresentationSettings.exe display работать не будет.

Лира
источник
1

Бессонница мешает вашим окнам перейти в спящий режим, но это не инструменты командной строки, поэтому ваш сценарий с командами harrymc - лучшее решение

fluxtendu
источник