En Windows 2008: estoy intentando comprimir y copiar archivos a un servidor de respaldo. Utilizo línea de comando/archivo por lotes, registro el resultado en un archivo de registro, ahora quiero registrar también el tiempo paracadaarchivo en bucle.
El archivo por lotes 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
)
Mi problema:El tiempo es elmismodurante toda la duración del lote (el momento en que el lotecomenzócuando esperaba el tiempo real en cada bucle). Ya especificé setlocal enableelayedexpansion que no ayuda (entonces, ¿lo necesito o no?).
NB: esto no resolverá mi problema ya que necesito tiempo en cada ciclo. NB2. Estoy llamando a este lote desde el programador de ventanas.
Respuesta1
El problema es que en la línea (el ( )
bloque se analiza como una sola línea), todas %foo%
las variables se evalúan solo una vez, antes de ejecutar el for
ciclo.
La enabledelayedexpansion
opciónhaceayuda. Sin embargo, no cambia las reglas de análisis de la %foo%
sintaxis de variable habitual. En cambio, introduce uno nuevo: utilizar !
como delimitadores.
for %%i in (*.nsf) do (
echo !date! !time!>> C:\backup\resuZip.log
)
Sin embargo, hay que tener mucho cuidado con esto, ya que la expansión retrasada se produce después de que %foo%
se han ampliado las variables. Por lo tanto, se producirá un resultado inesperado si una %
variable tiene signos de exclamación. Las reglas de análisis de cmd.exe son francamente dolorosas a veces.
Le recomiendo encarecidamente que utilice un idioma diferente para su guión. PowerShell sería una buena opción, considerando que forma parte de las versiones más recientes de Windows y tiene herramientas para administrar varios componentes de Windows Server.