เหลือเวลาก่อนปิดเครื่องตามกำหนดหรือไม่


8

มีวิธีใดบ้างที่จะดูระยะเวลาที่เหลือก่อนที่จะปิดระบบตามกำหนดเวลาใน Windows 7

ด้วยการปิดระบบตามกำหนดเวลาฉันหมายถึงการปิด (หรือรีสตาร์ท) ตามกำหนดเวลาโดยใช้shutdown.exeแอปพลิเคชันบรรทัดคำสั่งเช่น:

shutdown /t 600 /s

นั่นจะปรากฏขึ้นในกล่องข้อความบอกว่ามี 10 นาทีจนกระทั่งปิดและเวลาระบบที่แท้จริงของการปิด

เมื่อใดก็ตามที่นานกว่า600วินาทีจะใช้ข้อความบอลลูนแทน

ฉันจำ XP ที่ให้การตรวจสอบความคืบหน้ากับ GUI ได้อย่างง่ายดายด้วยการนับถอยหลัง

พวกเขาทำงานอย่างไร เวลาปิดที่เหลือหรือเวลาที่กำหนดจะต้องเก็บไว้ที่ไหนฉันจะเข้าถึงได้อย่างไร

การตั้งค่าของฉันเป็นวิธีการบางอย่างผ่านบรรทัดคำสั่ง (เช่นไม่ใช่ GUI) ที่สำคัญกว่านี้สามารถทำได้ภายใน Windows เช่นไม่มีโปรแกรมอื่น ๆ หรือไม่

หากไม่สามารถทำได้ด้วยยูทิลิตี้ Windows มาตรฐาน (และฉันติดกับอาณาเขต Stack Overflow ที่นี่) มี Windows API (หรือ. NET ซึ่งสามารถใช้งานได้ใน PowerShell!) หรือไม่ อาจเป็นที่ต้องการมากกว่าโปรแกรมของบุคคลที่สามแบบสุ่ม


superuser.com/a/317062/117590ดูมีแนวโน้ม แต่ก็เป็นที่ต้องการ / จำเป็นที่คำสั่งปิดเครื่องจะไม่ได้รับการแก้ไขเมื่อเพิ่มความคิดเห็น ( /c <time>)
บ๊อบ

ฉันคิดว่าไฟล์แบทช์จะไม่ยากในการเขียน .. ให้เวลาและทุก ๆ 5 นาทีหรือมากกว่านั้นก็สามารถตอบสนองต่อเวลา IE "เหลืออีก 10 นาที" .. และเมื่อถึง 1 นับถอยหลังด้วย วินาทีหรืออะไรสักอย่าง
cutrightjm

ฉันไม่ต้องการการนับถอยหลังฉันต้องการวิธีการบางอย่างเพื่อให้ได้เวลาที่เหลืออยู่ในขณะนี้ คำสั่ง shutdown กำลังถูกเรียกใช้โดยโปรแกรมภายนอก
บ๊อบ

คำตอบ:


5

คำถามน่าสนใจดังนั้นฉันจึงเขียนแบทช์ที่สามารถทำงานให้คุณได้

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

ขณะนี้มีไฟล์สองไฟล์ที่ทำงานร่วมกันหนึ่งรายการเริ่มจับเวลาและอื่น ๆ เมื่อถูกเรียกจะบอกเวลาที่ผ่านไปตั้งแต่เริ่มจับเวลา ไฟล์สองไฟล์เหล่านี้สามารถรวมกันได้อย่างง่ายดายเป็นหนึ่ง cmd script วิธีนี้คุณสามารถทำให้บางบรรทัดนำมาใช้ใหม่ ( เช่นวิธีการที่กำหนด ) เกินไป

เอาล่ะมาดูสคริปต์กัน

นี่คือStartTimer.cmd:

@ECHO OFF
FOR /F "skip=1 tokens=1-6" %%a IN ('wmic Path Win32_Localtime GET year^,month^,day^,hour^,minute^,second /format:TABLE ^| findstr /r "."') DO (
  SET DateD=%%a
  SET TimeH=%%b
  SET TimeM=%%c
  SET DateM=%%d
  SET TimeS=%%e
  SET DateY=%%f
)
SET /A EPOCH=((%DateY%-1970)*365*24*60*60)+(%DateM%*30*24*60*60)+(%DateD%*24*60*60)+(%TimeH%*60*60)+(%TimeM%*60)+%TimeS%
ECHO %EPOCH% > Timer.start.state

ในบรรทัดที่เริ่มต้นด้วยFOR /F "skip=1 ...:
1.ขอwmicเวลาและวันที่ปัจจุบัน
2.ข้ามบรรทัดแรกของการส่งออกซึ่งเป็นส่วนหัวด้วยskip=1
3.ค่าใช้อ่านtokens=1-6ความหมายแยกจากกันโดย%%a-%%f 4.เก็บค่าตัวแปร, ... , ...SpaceorTAB
%DateY%%TimeH%%TimeM%

หลังจากนั้นที่บรรทัดเริ่มต้นSET /A EPOCH=...เราใช้นิพจน์ที่คำนวณวินาทีที่ผ่านไป1.1.1970 ( นี่เป็นค่าประมาณอย่างง่ายไม่ใช่เวลายูนิกซ์จริงดู Google หากคุณต้องการความแม่นยำ )

จากนั้นที่บรรทัดสุดท้ายจะECHO %EPOCH% > ...เขียนเวลาคำนวณไปยังไฟล์ที่เรียกว่า " Timer.start.state"

และที่นี่GetTimerValue.cmd:

@ECHO OFF

GOTO CHECKFILE

:TIMEOUT
FOR /F "skip=1 tokens=1-6" %%a IN ('wmic Path Win32_Localtime GET year^,month^,day^,hour^,minute^,second /format:TABLE ^| findstr /r "."') DO (
    SET DateD=%%a
    SET TimeH=%%b
    SET TimeM=%%c
    SET DateM=%%d
    SET TimeS=%%e
    SET DateY=%%f
)
SET /P Timer=<"Timer.start.state"
SET /A EPOCH=((%DateY%-1970)*365*24*60*60)+(%DateM%*30*24*60*60)+(%DateD%*24*60*60)+(%TimeH%*60*60)+(%TimeM%*60)+%TimeS%
SET /A Elapsed=%EPOCH%-%Timer%
ECHO "Seconds since timer started: %Elapsed%"
GOTO EOF

:CHECKFILE
IF EXIST "Timer.start.state" (
  GOTO TIMEOUT
) ELSE (
  ECHO "Timer not started. Start timer by running Timer.cmd"
)

:EOF

การไหลของโค้ดที่นี่ไม่ใช่เชิงเส้นจากบนลงล่าง ก่อนอื่นเราติดGOTO CHECKFILEป้ายกำกับเพื่อให้คำสั่งการดำเนินการเริ่มต้นที่บรรทัดที่ระบุ:CHECKFILEไว้ หลายสิ่งหลายอย่างที่นี่เหมือนกับStartTimer.cmdฉันเลยอธิบายเฉพาะบรรทัดใหม่หรือที่เปลี่ยนไป

ก่อนอื่นเราจะตรวจสอบว่าTimer.start.stateมีไฟล์สถานะอยู่หรือไม่ถ้าไม่แล้วก็เลิกใช้ข้อความ wit หากตัวจับเวลาเริ่มต้นและไฟล์มีอยู่แล้วเราจะดำเนินการต่อและทำคณิตศาสตร์:
1.ข้ามไปยัง:TIMEOUTตำแหน่งที่เราส่งออกวินาทีที่ผ่านไป คุณสามารถเลือกป้ายกำกับที่ดีกว่าสำหรับ ...
2. SET /P %Timer% ...อ่านเวลาเริ่มต้นจากไฟล์และกำหนดค่าให้กับ%Timer%ตัวแปร
3. SET /A Elapsed ...คำนวณวินาทีระหว่างเวลาเริ่มต้นและตอนนี้
4. ECHO "Seconds ...สะท้อนค่าที่คำนวณได้ (วินาทีนับตั้งแต่การเริ่มจับเวลา)

วิธีรับเวลาที่เหลืออยู่:

คุณสามารถย่อ%Elapsed%จาก%MaxTime%:

@ECHO OFF
GetTimerValue
SET /A TimeLeft=%MaxTime%-%Elapsed%
ECHO "You have %TimeLeft% seconds remaining"

ตกลงอธิบายให้พอ นี่คือสคริปต์แบบเต็มTimer.cmd:

ณ จุดนี้ลืมทุกอย่างที่พูดไปแล้ว ไฟล์ชุดนี้ที่นี่เป็นคนที่ทำงานเป็นของตัวเองดังนั้นจึงไม่มีแยกต่างหากStartTimer.cmdหรือแต่เพียงแค่นี้GetTimerValue.cmd Timer.cmdโดยพื้นฐานแล้วยังคงเหมือนเดิม แต่การไหลของรหัสแตกต่างกันและการใช้งานก็แตกต่างกันโดยสิ้นเชิง อย่างไรก็ตามนี่ไม่ได้บันทึกสถานะเป็นไฟล์ดังนั้นคุณจึงไม่สามารถรับค่าตัวจับเวลาได้อีกต่อไปหลังจากออกจากระบบ / รีบูตหากคุณต้องการตัวอย่างการใช้งานด้านบนเพื่อบันทึก / อ่านสถานะไปยัง / จากไฟล์

การใช้งาน / ช่วยเหลือสำหรับTimer.cmdพิมพ์เมื่อทำงานโดยไม่มีข้อโต้แย้ง ฉันยังไม่ได้ทดสอบอย่างเต็มที่และอาจมีความผิดพลาดบางอย่างเป็นต้นไม่ได้ตรวจสอบความผิดพลาด

@ECHO OFF

GOTO TimerUser%1

:: ===================================
:: Operation is start, (re)start timer
:: ===================================
:TimerUserstart
ECHO %2 | FINDSTR /R "^[1-9]"
IF %ERRORLEVEL%==0 (
  SET Timer.max=%2
  GOTO TimerStart
) ELSE (
  ECHO.
  ECHO   !! ERROR !!
  ECHO   You must specify maximum value.
  ECHO   ===============================
  GOTO TimerUser
)

:: =============================================
:: Operation is get, get values if timer running
:: =============================================
:TimerUserget
IF DEFINED Timer.start.state (
  GOTO TIMEOUT
) ELSE (
  ECHO.
  ECHO   !! ERROR !!
  ECHO   Timer is not started, start timer first.
  ECHO   ========================================
  GOTO TimerUser
)

:: ============
:: Usage / Help
:: ============
:TimerUser
  ECHO.
  ECHO Timer.cmd Usage: Timer.cmd operation [options]
  ECHO.
  ECHO - Operations
  ECHO   start    Start new timer, n must be specified.
  ECHO   get      Get current value of started timer.
  ECHO.
  ECHO - Options:
  ECHO   n        Max value in seconds, used to calculate remaining time.
  ECHO.
GOTO EOF

:: =============================
:: Update %Timer.epoch% variable
:: =============================
:TimerUpdateEpoch
FOR /F "skip=1 tokens=1-6" %%a IN ('wmic Path Win32_Localtime GET year^,month^,day^,hour^,minute^,second /format:TABLE ^| findstr /r "."') DO (
    SET DateD=%%a
    SET TimeH=%%b
    SET TimeM=%%c
    SET DateM=%%d
    SET TimeS=%%e
    SET DateY=%%f
)
SET /A Timer.epoch=((%DateY%-1970)*365*24*60*60)+(%DateM%*30*24*60*60)+(%DateD%*24*60*60)+(%TimeH%*60*60)+(%TimeM%*60)+%TimeS%
GOTO %Timer.Callback%

:: ===========================================
:: Start new timer destoying/resetting old one
:: ===========================================
:TimerStart
SET Timer.Callback=TimerStartC1
GOTO TimerUpdateEpoch
:TimerStartC1
SET Timer.start.state=%Timer.epoch%
GOTO EOF

:: =============================
:: Echo out current timer values
:: =============================
:TIMEOUT
SET Timer.Callback=TimerEchoJ1
GOTO TimerUpdateEpoch
:TimerEchoJ1
SET /A Timer.elapsed=%Timer.epoch%-%Timer.start.state%
SET /A Timer.remaining=%Timer.max%-%Timer.elapsed%
ECHO "Seconds since timer started: %Timer.elapsed% Time remaining %Timer.remaining%"
GOTO EOF

:EOF

รวมกับshutdownหรือคำสั่งอื่น ๆ :

ไฟล์poweroff.cmd:

@ECHO OFF
Timer start %1
shutdown -t %1 -s

การใช้งาน: poweroff <wait_seconds>เพื่อเริ่มต้นการปิดระบบตามกำหนดเวลาและTimer getเพื่อรับเวลาที่เหลือ / ผ่าน


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

ตกลงฉันจะยอมรับสิ่งนี้ ฉันสิ้นสุดการเขียนโปรแกรม C # ที่เป็นชื่อที่เรียกว่าshutdown.exe shutdown_original.exeมันจะตรวจสอบการ/tตั้งค่าสถานะและถ้ามีอยู่ให้สร้างไฟล์ที่บันทึกเวลาเริ่มต้นและสิ้นสุด ในการดึงข้อมูลครั้ง ( /retrieveตั้งค่าสถานะ) มันจะตรวจสอบบันทึกเหตุการณ์เพื่อดูว่ามีการเริ่มต้นหรือยกเลิกตั้งแต่เริ่มจับเวลา ฉันไม่แน่ใจว่ามันจะจัดการกับการจำศีลได้อย่างไร ฉันจะไม่โพสต์รหัสหรือโปรแกรม: มันเป็นรถบักกี้ และเพื่อให้โปรแกรมทำงานฉันต้องยุ่งมากกับการตั้งค่าความปลอดภัยซึ่งฉันไม่ต้องการโปรโมต
Bob

แนวคิดพื้นฐานคือการสกัดกั้นการshutdown.exeโทรและการบันทึกเวลาลงในไฟล์ซึ่งเป็นสิ่งที่คุณทำและทำไมฉันจึงยอมรับสิ่งนี้
บ๊อบ

2
@Bob - คุณจะโพสต์เกี่ยวกับโปรแกรมของคุณเมื่อคุณกลับมา? ลิงก์ไปยัง exe / source code?
Alex S
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.