Dokładnie rejestruj datę i godzinę za pomocą pliku wsadowego

2

Mam plik wsadowy, który tworzy kopie zapasowe moich plików i działa dobrze, jednak chciałem móc rejestrować dokładną godzinę rozpoczęcia każdego zadania, ale nie działa zgodnie z oczekiwaniami.

@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
... 
)

Problem polega na tym, że otrzymuję dokładnie ten sam czas dla obu instancji% time%, zamiast wyświetlać dokładny czas, jak chciałem.

Zakładam, że ma to coś wspólnego z opóźnionym rozszerzaniem, być może DOS przypisuje wartość czasowi za pierwszym razem i zachowuje tę wartość przez cały plik.

Co powinienem zrobić, aby móc odzwierciedlić czas, w którym echo jest rzeczywiście wywoływane?

Luis Esparza LeedMx
źródło

Odpowiedzi:

6

Klasyczny problem z opóźnioną ekspansją.

Problem polega na tym, że %time%rozszerzenie występuje podczas analizowania instrukcji, a cały blok w nawiasach jest analizowany w tym samym czasie, przed wykonaniem jakichkolwiek poleceń.

Istnieją trzy możliwe rozwiązania:

1) Użyj TIME /Tzamiast tego

Pozwala to uniknąć całego problemu z czasem ekspansji. Ale format jest inny i po pewnym czasie pojawia się nowa linia, więc nie można dodać etykiety na końcu.

time /t
echo Backing up first part

Jeśli chcesz etykiety w tym samym wierszu, możesz odwrócić kolejność i użyć SET / P

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

Lub możesz uchwycić wyjście za pomocą pętli FOR / F i umieścić wszystko w jednym wierszu

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

2) Użyj POŁĄCZENIA i podwojonych procentów, aby uzyskać dodatkową rundę analizy

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

Zobacz, jak interpretuje skrypty interpretera poleceń systemu Windows (CMD.EXE)? dla zrozumienia, dlaczego to działa. Fazy ​​1 i 6 są tutaj istotne. Ale ostrzegam - jest to bardzo gęsty materiał, którego trawienie zajmie trochę czasu.

3) Użyj opóźnionego rozszerzenia

Jest to technika, której wolę używać.

Jest to znacznie szybsze niż włamanie do CALL. Wymaga SETLOCAL, aby umożliwić opóźnioną ekspansję i użyć !zamiast zamiast %do rozwinięcia zmiennej:

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
  ... 
)
dbenham
źródło