Data e hora do log com precisão com arquivo em lote

2

Eu tenho um arquivo em lotes que faz backup dos meus arquivos e funciona bem, no entanto, eu queria poder registrar o horário exato em que cada tarefa é iniciada, mas não está funcionando como eu esperava.

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

O problema é que recebo exatamente o mesmo horário para as duas instâncias de% time%, em vez de exibir o horário exato que eu queria.

Suponho que tenha algo a ver com a expansão atrasada, talvez o DOS atribua um valor à primeira vez e mantenha esse valor em todo o arquivo.

O que devo fazer para refletir o horário em que o eco é realmente chamado?

Luis Esparza LeedMx
fonte

Respostas:

6

Problema de expansão adiada clássico.

Seu problema é que a %time%expansão ocorre quando a instrução é analisada e todo o bloco entre parênteses é analisado ao mesmo tempo, antes que qualquer comando seja executado.

Existem três soluções possíveis:

1) Use em TIME /Tvez disso

Isso evita toda a questão do tempo de expansão. Mas o formato é diferente e há uma nova linha após o tempo, portanto você não pode adicionar um rótulo ao final.

time /t
echo Backing up first part

Se você quiser a etiqueta na mesma linha, poderá reverter a ordem e usar SET / P

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

Ou você pode capturar a saída com um loop FOR / F e colocar tudo em uma linha

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

2) Use CALL e porcentagens duplicadas para obter uma rodada extra de análise

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

Consulte Como o interpretador de comandos do Windows (CMD.EXE) analisa scripts? para entender por que isso funciona. As fases 1 e 6 são relevantes aqui. Mas esteja avisado - é um monte de material muito denso que levará tempo para digerir.

3) Use expansão atrasada

Essa é a técnica que eu prefiro usar.

Isso é muito mais rápido que o hack CALL. Requer SETLOCAL para habilitar a expansão atrasada e usar em !vez de %expandir a variável:

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
fonte