Escrevendo hora em um arquivo em um loop for

0

No Windows 2008: Estou tentando compactar e copiar arquivos para um servidor de backup. Eu uso linha de comando / arquivo de lote, eu registro o resultado em um arquivo de log, agora eu quero registrar também o tempo para cada arquivo 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-Zipz.exe"  -bd u "\backupServer\myBackup\%%~ni.zip" "%%~fi">>c:\backup\resuZip.log
)

Meu problema: O tempo é o mesmo para toda a duração do lote (o tempo em que o lote foi iniciado quando esperava o tempo real em cada loop). Eu já especifico setlocal enabledelayedexpansion que não ajuda (então eu 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.

    
por Emmanuel Gleizer 29.07.2014 / 07:15

1 resposta

3

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

A opção enabledelayedexpansion faz ajuda. No entanto, isso não altera as regras de análise para a sintaxe usual da variável %foo% . Em vez disso, ele introduz um novo - usando ! como delimitadores.

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

Tenha muito cuidado com isso, no entanto, como a expansão atrasada acontece depois que as variáveis %foo% foram expandidas. Portanto, isso resultará em uma saída inesperada se uma variável % tiver pontos de exclamação. As regras de análise do cmd.exe são completamente dolorosas às vezes.

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

    
por 29.07.2014 / 07:47