Escrevendo o tempo em um arquivo em um loop for

Escrevendo o tempo em um arquivo em um loop for

No Windows 2008: estou tentando compactar e copiar arquivos para um servidor de backup. Eu uso linha de comando/arquivo em lote, registro o resultado em um arquivo de log, agora quero registrar também o tempo paracadaarquivo em loop.

O arquivo em lote backupZipCopy.bat:

setlocal enabledelayedexpansion
echo starting at %date% %time%>>c:\backup\resuZip.log
d:
cd \myDirectoryToBackup
FOR %%i IN (*.nsf)  DO (
echo %date% %time%>>c:\backup\resuZip.log 
"C:\Program Files\7-Zip\7z.exe"  -bd u "\\backupServer\myBackup\%%~ni.zip" "%%~fi">>c:\backup\resuZip.log
)

Meu problema:A hora é amesmodurante toda a duração do lote (o momento em que o loteiniciadoquando eu esperava o tempo real em cada loop). Já especifiquei setlocal enabledelayeexpansion o que não ajuda (preciso disso ou não?).

NB, timethis não resolverá meu problema, pois preciso de tempo em cada loop. NB2, estou chamando esse lote do agendador de janelas.

Responder1

O problema é que na linha (o ( )bloco é analisado como uma única linha), todas %foo%as variáveis ​​são avaliadas apenas uma vez, antes de executar o forloop.

A enabledelayedexpansionopçãofazajuda. No entanto, isso não altera as regras de análise da %foo%sintaxe usual de variáveis. Em vez disso, introduz um novo – usando !como delimitadores.

for %%i in (*.nsf) do (
    echo !date! !time!>> C:\backup\resuZip.log
)

Porém, tenha muito cuidado com isso, pois a expansão atrasada ocorre após %foo%as variáveis ​​terem sido expandidas. Portanto, resultará em uma saída inesperada se uma %variável contiver pontos de exclamação. As regras de análise do cmd.exe às vezes são dolorosas.

Eu recomendo fortemente que você use uma linguagem diferente para o seu script. O PowerShell seria uma boa escolha, considerando que faz parte das versões mais recentes do Windows e possui ferramentas para gerenciar vários componentes do Windows Server.

informação relacionada