ป้องกันการนอนในสคริปต์


13

มีวิธีการป้องกันไม่ให้ Windows เข้าสู่โหมดสลีปในขณะที่รันโปรแกรมบนบรรทัดคำสั่งหรือกับ cygwin หรือไม่? เป็นการดีที่ฉันหวังว่าจะมีบางสิ่งที่สามารถใช้ได้เช่น:

nosleep myscript.sh

พื้นหลัง

บางครั้งฉันเริ่มงานที่ใช้เวลานานเช่นการสำรองข้อมูลด้วยตนเองหรือการถ่ายโอนไฟล์ขนาดใหญ่และฉันพบว่า Windows มักเข้าสู่โหมดสลีปก่อนที่งานเหล่านี้จะเสร็จสิ้น ฉันต้องการที่จะสามารถเริ่มต้นคำสั่งและป้องกันโหมดสลีปในขณะที่คำสั่งกำลังทำงานอยู่ แต่ให้ทำงานโดยอัตโนมัติอีกครั้งเมื่อคำสั่งเสร็จสิ้น

คำตอบ:


14

คุณสามารถใช้powercfgสคริปต์เพื่อเปลี่ยนเวลาที่พีซีรอจนกระทั่งเครื่องเข้าสู่โหมดสลีป:

ไม่ต้องเข้าสู่โหมดสแตนด์บาย:

powercfg -change -standby-timeout-ac 0

ไปที่โหมดสแตนด์บายใน 15 นาที:

powercfg -change -standby-timeout-ac 15

ขอบคุณ powercfg plus bash magic เป็นเพียงสิ่งที่ฉันต้องการ
Mr Fooz

น่าเสียดายที่สิ่งนี้จะลบล้างการตั้งค่าก่อนหน้าและคุณต้องเรียกคืนด้วยตนเอง
Leeroy

8

นี่คือสคริปต์ทุบตีที่ฉันทำขึ้นตามการตอบสนองของ 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และลบอันว่างเปล่า
sch

สิ่งนี้ทำให้แน่ใจว่าชุดรูปแบบพลังงานได้รับการกู้คืนแม้ว่า Ctrl-C จะเกิดขึ้นแต่สิ่งที่จะเป็น neater ก็คือการสร้างคำขอพลังงานที่ทำให้คอมพิวเตอร์ตื่นตัวตลอดระยะเวลาของสคริปต์โดยไม่ต้องเปลี่ยนการตั้งค่าใด ๆ อย่างถาวร แต่ดูเหมือนว่าไม่มีวิธีใด ๆ ที่สะอาดและง่ายในการทำเช่นนั้นเพื่อจัดการสถานะ อย่างไรก็ตามโปรแกรมเล่นสื่อที่ซ่อนอยู่ที่เล่นเงียบจะเป็นวิธีที่สกปรก แต่ง่าย ใน AutoHotkey ฉันสามารถหลีกเลี่ยงได้ด้วยการใช้เสียง Windows ที่เป็นค่าเริ่มต้น (ใช่สคริปต์แบบพกพา) Loop { SoundPlay, %A_WinDir%\Media\ding.wav }ไม่มีwaitข้อโต้แย้ง
Leeroy

2

ขณะนี้มีnosleepคำสั่งดังกล่าวใน Cygwin เพียงติดตั้งnosleepแพคเกจและเรียกใช้เป็น

nosleep myscript.sh

เขียนโดย Andrew E. Schulman ในปี 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 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 offหรือAutoHotkey SendMessage, 0x112, 0xF170, 2,, Program Manager บิวท์อินpowercfg /requestsoverride process PresentationSettings.exe displayจะไม่ทำงาน


1

การนอนไม่หลับช่วยป้องกันไม่ให้ windows เข้าสู่โหมดสลีป แต่ไม่ใช่เครื่องมือบรรทัดคำสั่งดังนั้นสคริปต์ของคุณด้วยคำสั่ง harrymc จึงเป็นวิธีแก้ปัญหาที่ดีกว่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.