Питання було цікавим, тому я написав партію, яка може зробити для вас роботу.
В основному це таймер зворотного відліку, я не включав shutdown
до цього команду, але залишив це як домашнє завдання. Розрахунки не точні, це не стосується високосних років, тривалості місяця, ... це головним чином для читабельності, оскільки я хотів, щоб це було легко вивчити.
В даний час два файли виконують роботу разом, один запускає таймер, а інший, коли викликається, повідомляє, скільки часу минуло від запуску таймера. Ці два файли досить легко поєднуватись в один cmd-скрипт, таким чином ви також можете зробити рядки для багаторазового використання ( наприклад, визначені методи ).
Гаразд, давайте подивимося на сценарії,
Ось 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
розділені на Spaceor
TAB.
4. Збережіть значення змінних %DateY%
, ... %TimeH%
,%TimeM%
...
Після цього на початку рядка SET /A EPOCH=...
ми використовуємо вираз, який обчислює минулі секунди1.1.1970
( це простий приблизний, а не реальний час Unix. Дивіться 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
існує файл стану , якщо ні, то закінчуємо повідомлення з дотепністю. Якщо таймер запустився і файли існують, то ми продовжуємо і робимо певну математику:
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
пройти / залишився час.
/c <time>
).