防止脚本中的睡眠


12

有没有一种方法可以防止Windows在命令行或cygwin上运行程序时进入睡眠模式?理想情况下,我希望可以使用以下方法:

nosleep myscript.sh

背景

有时,我会启动长期运行的工作,例如手动备份或大文件传输,而我发现Windows通常会在完成这些任务之前就进入睡眠状态。我希望能够在命令运行时启动该命令并防止进入睡眠模式,但是一旦命令完成,它就会自动再次运行。

Answers:


14

您可以powercfg在脚本中使用以更改PC进入睡眠状态之前的时间:

永不待机:

powercfg -change -standby-timeout-ac 0

15分钟后进入待机状态:

powercfg -change -standby-timeout-ac 15

谢谢。powercfg加上一些bash魔术正是我所需要的。
Fooz先生2010年

不幸的是,这会清除以前的设置,因此您必须手动还原它。
Leeroy

8

这是我根据harrymc的回应整理的bash脚本。

#!/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并删除了空参数。
sch 2016年

这可以确保即使在按Ctrl-C的情况下也可以恢复电源方案,但更巧妙的做法是只创建一个电源请求,使计算机在脚本运行期间保持唤醒状态,而无需永久更改任何设置。但是似乎没有任何干净,简便的方法可以做到这一点,因此可以管理状态。但是,隐藏的媒体播放器播放静音将是一种肮脏但简单的方法。在AutoHotkey中,我什至可以使用默认的Windows声音(是,可移植脚本)。Loop { SoundPlay, %A_WinDir%\Media\ding.wav },无需wait争论。
Leeroy

2

nosleepCygwin中现在有这样的命令。只需安装nosleep软件包并以

nosleep myscript.sh

由Andrew E.Schulman在2011年撰写。请参阅https://cygwin.com/ml/cygwin/2011-09/msg00151.html

在Launchpad上。它使用SetThreadExecutionState()(就像已经提到的Insomnia),不会创建单独的电源方案。

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 Mobility Center使用演示模式(如果可用)

%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 offAutoHotkey SendMessage, 0x112, 0xF170, 2,, Program Manager 内置powercfg /requestsoverride process PresentationSettings.exe display将无法运行。


1

失眠会阻止您的窗户进入睡眠状态,但它不是命令行工具,因此带有harrymc命令的脚本是更好的解决方案

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.