cmd – как показать время выполнения команды: пошаговое руководство

Как получить актуальное время в 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 или арифметикой времени в скриптах.

И наконец, для регулярного мониторинга и удобства, рекомендуется настройка приглашения командной строки с отображением меток времени, чтобы всегда видеть когда и сколько выполнялась команда.

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *