Pertanyaan itu menarik jadi saya menulis batch yang dapat melakukan pekerjaan untuk Anda.
Pada dasarnya ini adalah penghitung waktu mundur, saya tidak memasukkan shutdown
perintah untuk ini tetapi meninggalkannya sebagai pekerjaan rumah. Perhitungannya tidak akurat, ini tidak peduli tahun kabisat, panjang bulan, ... ini terutama untuk keterbacaan karena saya ingin tetap mudah dipelajari.
Saat ini ada dua file melakukan pekerjaan bersama, satu mulai timer dan lainnya, ketika dipanggil, memberi tahu berapa banyak waktu yang telah berlalu dari timer mulai. Kedua file ini dapat dengan mudah digabungkan menjadi satu skrip cmd, dengan cara ini Anda dapat membuat beberapa baris dapat digunakan kembali ( seperti metode yang didefinisikan ) juga.
Oke, mari kita lihat skrip,
Ini adalah 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
Sejalan dimulai dengan FOR /F "skip=1 ...
:
1. Tanyakan wmic
waktu dan tanggal saat ini.
2. Lewati baris pertama output, yaitu heading, oleh skip=1
3. Baca nilai menggunakan tokens=1-6
makna yang %%a-%%f
dipisahkan oleh Spaceor
TAB.
4. nilai Store untuk variabel %DateY%
, ... %TimeH%
, %TimeM%
, ...
Setelah itu di awal, SET /A EPOCH=...
kami menggunakan ekspresi yang menghitung detik berlalu1.1.1970
( ini adalah perkiraan sederhana, bukan waktu unix nyata. Lihat Google jika Anda perlu akurat ).
Kemudian pada baris terakhir ECHO %EPOCH% > ...
tulis waktu yang dihitung ke file bernama " Timer.start.state
".
Dan di sini 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
Di sini aliran kode tidak linier dari atas ke bawah. Pertama kita GOTO CHECKFILE
memberi label sehingga perintah eksekusi benar-benar dimulai pada baris yang mengatakan :CHECKFILE
. Banyak hal di sini sama seperti dengan StartTimer.cmd
jadi saya hanya menjelaskan baris baru atau yang diubah.
Pertama kita periksa apakah file negara Timer.start.state
ada, jika tidak maka hentikan pesan kecerdasan. Jika penghitung waktu dimulai dan file ada, maka kami melanjutkan dan melakukan penghitungan:
1. Lompat ke :TIMEOUT
tempat kami mengeluarkan detik yang telah berlalu. Anda dapat memilih label yang lebih baik untuk itu ...
2. SET /P %Timer% ...
membaca waktu mulai dari file dan menetapkan nilai ke %Timer%
variabel.
3. SET /A Elapsed ...
menghitung detik antara waktu mulai dan sekarang.
4. ECHO "Seconds ...
menggemakan nilai yang dihitung (detik sejak penghitung waktu mulai
Cara mendapatkan sisa waktu:
Anda dapat mengurangi %Elapsed%
dari %MaxTime%
:
@ECHO OFF
GetTimerValue
SET /A TimeLeft=%MaxTime%-%Elapsed%
ECHO "You have %TimeLeft% seconds remaining"
OKE, cukup dijelaskan. Berikut ini skrip lengkap Timer.cmd
:
Pada titik ini, lupa semua yang sudah dikatakan. File batch ini di sini berfungsi sendiri sehingga tidak ada yang terpisah StartTimer.cmd
atau GetTimerValue.cmd
hanya ini Timer.cmd
. Pada dasarnya masih sama tetapi aliran kode berbeda dan penggunaannya juga sama sekali berbeda. Namun ini tidak menyimpan status ke file sehingga Anda tidak bisa lagi mendapatkan nilai waktu setelah logoff / reboot, jika Anda memerlukan contoh penggunaan di atas untuk menyimpan / membaca status ke / dari file.
Penggunaan / bantuan Timer.cmd
dicetak saat dijalankan tanpa argumen. Saya belum sepenuhnya menguji ini dan mungkin ada beberapa kesalahan ketik dll, args tidak sangat mudah diperiksa.
@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
Integrasikan dengan shutdown
atau perintah lain:
File poweroff.cmd
:
@ECHO OFF
Timer start %1
shutdown -t %1 -s
Penggunaan: poweroff <wait_seconds>
untuk memulai penghentian waktu dan Timer get
untuk mendapatkan sisa waktu.
/c <time>
) tidak.