Как получить актуальное время в Windows CMD после паузы: работа с переменными %DATE% и %TIME%
Если вы когда-либо пытались вывести текущее время до и после выполнения команды с задержкой в Windows командной строке (CMD), то, скорее всего, заметили, что переменные окружения %DATE% и %TIME% не обновляются автоматически в рамках одного вызова команды. Например, команда:
echo %DATE% %TIME% & timeout 5 & echo %DATE% %TIME%
выведет одинаковое время для первой и второй части — потому что переменные расширяются при разборе команды, а не во время её выполнения.
Почему так происходит?
Командный процессор Windows CMD заменяет переменные в строке ещё до её выполнения. Это значит, что в конструкции, где несколько команд объединены одной строкой (через &), все вхождения переменных будут подставлены единожды в момент разбора, а не каждый раз при исполнении отдельной команды.
Варианты решения
Вариант 1: Включение отложенного расширения переменных
В CMD существует опция отложенного расширения переменных (Delayed Variable Expansion). При её включении переменные записываются между восклицательными знаками !VAR! и подставляются во время выполнения, а не при разборе строки.
Пример команды:
cmd /V:ON /C "echo !DATE! !TIME! & timeout 5 & echo !DATE! !TIME!"
Результат будет примерно таким:
Wed 11/19/2025 0:03:00.45
Waiting for 5 seconds, press a key to continue ...
Wed 11/19/2025 0:03:05.19
Вывод показывает, что время корректно обновилось после паузы.
Эта техника работает и в пакетных скриптах, если внутри них использовать:
setlocal enabledelayedexpansion
echo !DATE! !TIME! & timeout 5 & echo !DATE! !TIME!
endlocal
Вариант 2: Использование команды net time для получения времени с удалённого сервера
Если вам важно получить точное системное время (например, сервера домена), можно воспользоваться командой net time с указанием источника времени:
net time \\%userdomain% & timeout 5 & net time \\%userdomain%
Или так:
net time %logonserver% & timeout 5 & net time %logonserver%
Пример вывода:
Current time at \\PCNAME is 11/18/2025 8:34:30 PM
The command completed successfully.
Waiting for 5 seconds, press a key to continue ...
Current time at \\PCNAME is 11/18/2025 8:34:35 PM
The command completed successfully.
Это полезно, если нужно получить время сервера в сети, а не локальное время машины.
Вариант 3: Использование команды call для повторного расширения переменных
Если нужно выполнить всё в одной строке, можно прибегнуть к трюку с командами call, которые запускают повторный разбор строк с параметрами:
echo %DATE% %TIME% & timeout 1 & call echo ^%DATE^% ^%TIME^%
В скрипте это будет выглядеть так:
echo %DATE% %TIME%
timeout 1
call echo %%DATE%% %%TIME%%
Таким образом, значение переменных расширится заново после паузы.
Вариант 4: Измерение времени выполнения с помощью арифметики времени
Если цель — не просто вывести время, а вычислить длительность выполнения команды, можно применить вычисления с помощью команды set /A и выделения подстрок времени:
setlocal enabledelayedexpansion
set "START=!TIME!" & timeout 5 > nul & set "END=!TIME!"
set /A DURATION=(1!END:~0,2!-1!START:~0,2!)*3600 + (!END:~3,2!-!START:~3,2!)*60 + (!END:~6,2!-!START:~6,2!)
if !DURATION! LSS 0 set /A DURATION+=86400
echo Command took !DURATION! seconds
endlocal
Здесь мы учитываем часы, минуты и секунды. Если измерение продолжается после полуночи, добавляем 86400 секунд к результату.
Вариант 5: Использование расширенного приглашения (prompt) для логирования времени
Можно настроить приглашение командной строки так, чтобы оно автоматически отображало время запуска и завершения команды, например, с помощью такой установки:
set prompt=$T$H$H$H$H$H$H$S%computername%\%username%$S$M$P$+$G
Благодаря ему в консоли будут видны метки времени с сотыми долями секунд до и после выполнения команды. Вы можете предварять команды выводом времени:
echo %time% & (ваша команда)
В итоге вы увидите когда команда стартовала и когда завершилась, чтобы по разнице вычислить длительность.
Что лучше выбрать?
- Для простой проверки времени после паузы отлично подходит отложенное расширение переменных —
cmd /V:ONи!TIME!. - Если нужно получить время сервера или домена, используйте
net time. - Если нужно в скрипте получать два раза обновлённое время в одной строке, удобно использовать трюк с командой
call. - Для вычисления времени выполнения команд — лучше делать расчёты с использованием вычислений через
set /Aи учитывать возможный переход через полночь. - Для продвинутого логирования и мониторинга, настройка приглашения с выводом времени поможет автоматизировать контроль.
Итоги и рекомендации
Переменные окружения %DATE% и %TIME% в Windows CMD расширяются один раз при разборе строки, из-за чего при нескольких командах в одной строке время не меняется автоматически. Применение отложенного расширения переменных (setlocal enabledelayedexpansion и !TIME!) решает эту проблему и подходит для большинства случаев.
Если же задача сложнее — например, нужно точно вычислять длительности или брать время из доменных источников — стоит воспользоваться встроенными инструментами net time или арифметикой времени в скриптах.
И наконец, для регулярного мониторинга и удобства, рекомендуется настройка приглашения командной строки с отображением меток времени, чтобы всегда видеть когда и сколько выполнялась команда.


