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 shutdown
lệ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 wmic
ngà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-6
nghĩa được %%a-%%f
phân tách bằng Spaceor
TAB.
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 CHECKFILE
dá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.cmd
vậ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.state
có 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 :TIMEOUT
nơ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.cmd
hay GetTimerValue.cmd
như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 shutdown
hoặ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.
/c <time>
).