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 for
loop.
A enabledelayedexpansion
opçã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.