Thời gian còn lại trước khi tắt máy theo lịch trình?


8

Có cách nào để xem thời gian còn lại trước khi tắt máy theo lịch trình trong Windows 7 không?

Bằng cách tắt máy theo lịch trình, tôi có nghĩa là tắt máy (hoặc khởi động lại) theo lịch trình bằng shutdown.exeứng dụng dòng lệnh , ví dụ:

shutdown /t 600 /s

Điều đó sẽ bật lên một hộp thông báo cho biết có 10 phút cho đến khi tắt máy và thời gian thực sự tắt hệ thống.

600Thay vào đó, thời gian dài hơn giây sẽ sử dụng tin nhắn bóng bay.

Tôi mơ hồ nhớ lại XP cung cấp trình theo dõi tiến trình GUI, với bộ đếm ngược.

Họ đã làm việc như thế nào? Thời gian tắt máy còn lại hoặc thời gian dự kiến ​​phải được lưu trữ ở đâu đó, làm thế nào tôi có thể truy cập này?

Sở thích của tôi là một số phương thức thông qua dòng lệnh (tức là không phải GUI). Quan trọng hơn, điều này có thể thực hiện được trong Windows, tức là không có bất kỳ chương trình bên thứ ba nào không?

Nếu điều này không thể thực hiện được với các tiện ích Windows tiêu chuẩn (và tôi giáp với lãnh thổ Stack Overflow ở đây), thì có API Windows (hoặc .NET, thậm chí có thể được sử dụng trong chức năng PowerShell!)? Hoặc sẽ được ưu tiên hơn một số chương trình bên thứ ba ngẫu nhiên.


superuser.com/a/317062/117590 có vẻ đầy hứa hẹn, tuy nhiên, điều được ưu tiên / yêu cầu là lệnh tắt máy không được sửa đổi như thêm một nhận xét ( /c <time>).
Bob

Tôi nghĩ rằng một tệp bó sẽ không khó để viết .. Nhắc về thời gian và cứ sau 5 phút, nó có thể phản hồi theo thời gian, IE "còn 10 phút" .. và khi đến 1, hãy đếm ngược giây hoặc một cái gì đó
cutrightjm

Tôi không cần đếm ngược, tôi cần một số phương pháp để có được thời gian còn lại tại thời điểm <this> này. Lệnh shutdown đang được gọi bởi một chương trình bên ngoài.
Bob

Câu trả lời:


5

Câu hỏi rất thú vị vì vậy tôi đã viết một loạt có thể làm việc cho bạn.

Về cơ bản nó là đồng hồ đếm ngược, tôi không bao gồm shutdownlệnh này mà chỉ coi nó là bài tập về nhà. Tính toán không chính xác, điều này không quan tâm đến năm nhuận, độ dài của tháng, ... điều này chủ yếu để dễ đọc vì tôi muốn giữ cho nó dễ học.

Hiện tại có hai tệp làm việc cùng nhau, một tệp bắt đầu hẹn giờ và tệp kia, khi được gọi, cho biết thời gian trôi qua từ khi bắt đầu hẹn giờ. Hai tệp này có thể dễ dàng kết hợp thành một tập lệnh cmd, bằng cách này bạn cũng có thể tạo một số dòng có thể sử dụng lại ( như các phương thức đã xác định ).

Được rồi, chúng ta hãy xem các kịch bản,

Đây là 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

Trong dòng bắt đầu bằng FOR /F "skip=1 ...:
1. Hỏi wmicngày giờ hiện tại.
2. Bỏ qua dòng đầu ra đầu tiên, là tiêu đề, bằng skip=1
3. Đọc các giá trị sử dụng tokens=1-6nghĩa được %%a-%%fphân tách bằng SpaceorTAB.
4. giá trị Store để biến %DateY%, ... %TimeH%, %TimeM%, ...

Sau đó, tại dòng bắt đầu, SET /A EPOCH=...chúng tôi sử dụng biểu thức tính toán giây trôi qua1.1.1970 ( đây là thời gian gần đúng đơn giản, không phải là thời gian unix thực. Xem Google nếu bạn cần chính xác ).

Sau đó, ở dòng cuối cùng ECHO %EPOCH% > ...ghi thời gian tính vào tệp gọi là " Timer.start.state".

Và đây 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

Ở đây dòng mã không tuyến tính từ trên xuống dưới. Đầu tiên chúng ta GOTO CHECKFILEdán nhãn để các lệnh thực thi thực sự bắt đầu tại dòng có nội dung :CHECKFILE. Nhiều thứ ở đây cũng giống như StartTimer.cmdvậy nên tôi chỉ giải thích những dòng mới hoặc thay đổi.

Đầu tiên chúng ta kiểm tra xem tập tin trạng thái Timer.start.statecó tồn tại không, nếu không thì chấm dứt thông báo wit. Nếu bộ đếm thời gian bắt đầu và các tệp tồn tại thì chúng ta tiếp tục và thực hiện một số phép toán:
1. Chuyển đến :TIMEOUTnơi chúng ta xuất ra giây trôi qua. Bạn có thể chọn nhãn tốt hơn cho điều đó ...
2. SET /P %Timer% ... đọc thời gian bắt đầu từ tệp và gán giá trị cho %Timer%biến.
3. SET /A Elapsed ... tính toán giây giữa thời gian bắt đầu và bây giờ.
4. ECHO "Seconds ... dội lại giá trị tính toán (giây kể từ khi khởi động hẹn giờ.

Làm thế nào để có được thời gian còn lại:

Bạn có thể trừ %Elapsed%từ %MaxTime%:

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

OK, giải thích đủ. Đây là kịch bản đầy đủ Timer.cmd:

Tại thời điểm này, quên tất cả mọi thứ đã nói. Batch file này ở đây đang làm việc trên riêng của nó vì vậy không có riêng StartTimer.cmdhay GetTimerValue.cmdnhưng chỉ này Timer.cmd. Về cơ bản nó vẫn giống nhau nhưng dòng mã thì khác và cách sử dụng cũng hoàn toàn khác. Tuy nhiên, điều này không lưu trạng thái vào tệp để bạn không thể nhận giá trị bộ đếm thời gian sau khi đăng xuất / khởi động lại, nếu bạn cần ví dụ sử dụng ở trên để lưu / đọc trạng thái vào / từ tệp.

Sử dụng / trợ giúp cho Timer.cmdđược in khi chạy mà không có đối số. Tôi chưa kiểm tra đầy đủ điều này và có thể có một số lỗi chính tả, v.v.

@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

Tích hợp với shutdownhoặc bất kỳ lệnh nào khác:

Tập tin poweroff.cmd:

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

Cách sử dụng: poweroff <wait_seconds>để bắt đầu tắt máy tính giờ và Timer getđể có thời gian trôi qua / thời gian còn lại.


Tôi hoan nghênh bạn cho những nỗ lực. Tôi mới nhận ra câu hỏi tệ đến mức nào, nhưng bạn vẫn trả lời được. Chỉ cần bạn nhận được một upvote. Thật không may, điều này không hoạt động với các lệnh tắt tùy ý, tức là StartTimer.cmdphải được gọi rõ ràng. Tôi đã viết một chương trình nhỏ để giải quyết vấn đề của mình, tôi sẽ đăng khi tôi quay lại máy tính của mình.
Bob

Ok, tôi sẽ chấp nhận điều này. Cuối cùng tôi đã viết một chương trình C # được đặt tên shutdown.exe, được gọi là shutdown_original.exe. Nó sẽ kiểm tra /tcờ và nếu nó tồn tại, hãy tạo một tệp có thời gian bắt đầu và kết thúc được lưu. Khi truy xuất thời gian ( /retrievecờ), nó sẽ kiểm tra nhật ký sự kiện để xem liệu khởi động hoặc hủy bỏ được thực hiện kể từ khi bộ định thời bắt đầu. Tôi không chắc nó sẽ xử lý ngủ đông như thế nào. Tôi sẽ không đăng mã hoặc chương trình: đó là một mớ lỗi. Và để chương trình hoạt động, tôi đã phải loay hoay rất nhiều với các cài đặt bảo mật mà tôi không muốn quảng bá.
Bob

Khái niệm cơ bản là chặn shutdown.execuộc gọi và ghi lại thời gian vào một tệp, đó là những gì bạn đã làm và tại sao tôi chấp nhận điều này.
Bob

2
@Bob - Bạn sẽ đăng bài về chương trình của mình khi quay lại? Liên kết đến exe / mã nguồn?
Alex S
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.