В Windows 2008: Я пытаюсь заархивировать и скопировать файлы на резервный сервер. Я использую командную строку/пакетный файл, я записываю результат в файл журнала, теперь я хочу также записать время длякаждыйфайл зациклен.
Пакетный файл 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
)
Моя проблема:Настало времятакой жена протяжении всей партии (время, когда партияначалкогда я ожидал реального времени в каждом цикле). Я уже указал setlocal enabledelayexpansion, что не помогает (так нужно ли мне это или нет?).
NB timethis не решит мою проблему, так как мне нужно время в каждом цикле. NB2 Я вызываю этот пакет из планировщика окна.
решение1
Проблема в том, что в строке ( ( )
блок анализируется как одна строка) все %foo%
переменные оцениваются только один раз, перед запуском for
цикла.
Опцияenabledelayedexpansion
делаетhelp. Однако это не меняет правила разбора обычного %foo%
синтаксиса переменных. Вместо этого он вводит новый — использование !
в качестве разделителей.
for %%i in (*.nsf) do (
echo !date! !time!>> C:\backup\resuZip.log
)
Однако будьте очень осторожны с этим, поскольку отложенное расширение происходит после того, как %foo%
переменные были расширены. Поэтому это приведет к неожиданному выводу, если %
переменная содержит восклицательные знаки. Правила разбора cmd.exe порой просто болезненны.
Я настоятельно рекомендую вам использовать другой язык для вашего скрипта. PowerShell был бы хорошим выбором, учитывая, что он является частью последних выпусков Windows и имеет инструменты для управления различными компонентами Windows Server.