1

У меня есть пакетный файл, который выполняет резервное копирование моих файлов и работает хорошо, однако я хотел иметь возможность регистрировать точное время каждой задачи, но он не работает, как я ожидал.

@echo off
> C:\log\%date:~3,2%-%date:~0,2%.log (
echo %time% - Backing up first part
... some logic
echo %time% - Backing up second part
... 
)

Проблема в том, что я получаю одинаковое время для обоих экземпляров% time% вместо того, чтобы отображать точное время, как я хотел.

Я предполагаю, что это как-то связано с отложенным расширением, возможно, DOS присваивает значение времени в первый раз и сохраняет это значение в течение всего файла.

Что я должен сделать, чтобы иметь возможность отражать время, когда эхо фактически вызывается?

1 ответ1

5

Классическая проблема с отложенным расширением.

Ваша проблема заключается в том, что %time% раскрытие происходит, когда оператор анализируется, и весь блок в скобках анализируется в то же время, прежде чем какие-либо команды будут выполнены.

Есть три возможных решения:

1) Вместо этого используйте TIME /T

Это позволяет избежать всего вопроса о сроках расширения. Но формат другой, и через некоторое время появляется новая строка, поэтому вы не можете добавить метку в конец.

time /t
echo Backing up first part

Если вы хотите, чтобы метка находилась на одной и той же строке, вы можете изменить порядок и использовать SET /P

<nul set /p "Backing up first part - "
time /t

Или вы можете захватить вывод с помощью цикла FOR /F и поместить все в одну строку

for /f "delims=" %%T in ('time /t') do echo %%T - Backing up first part:

2) Используйте CALL и удвоенный процент, чтобы получить дополнительный раунд анализа

call echo %%time%% - Backing up first part:

См. Как интерпретатор сценариев команд Windows (CMD.EXE) анализирует? для понимания того, почему это работает. Фазы 1 и 6 актуальны здесь. Но будьте предупреждены - это много очень плотного материала, который займет время, чтобы переварить.

3) Используйте отложенное расширение

Это техника, которую я предпочитаю использовать.

Это намного быстрее, чем взломать CALL. Требуется SETLOCAL для включения отложенного расширения и использования ! вместо % чтобы развернуть переменную:

setlocal enableDelayedExpansion
> C:\log\%date:~3,2%-%date:~0,2%.log (
  echo !time! - Backing up first part
  ... some logic
  echo !time! - Backing up second part
  ... 
)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .