В 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 enabledelayedexpansion, который не помогает (так мне это нужно или нет?).

NB время это не решит мою проблему, так как мне нужно время в каждом цикле. NB2 Я вызываю этот пакет из планировщика окон.

1 ответ1

3

Проблема заключается в том, что в строке ( блок ( ) анализируется как одна строка) все переменные %foo% оцениваются только один раз перед запуском цикла for .

Опция enabledelayedexpansion помогает. Однако он не меняет правила синтаксического анализа для обычного синтаксиса переменной %foo% . Вместо этого он вводит новый - используя ! в качестве разделителей.

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

Однако будьте очень осторожны с этим, поскольку отложенное расширение происходит после раскрытия переменных %foo% . Поэтому это приведет к неожиданному выводу, если в переменной % есть восклицательные знаки. Правила разбора cmd.exe иногда просто болезненны.

Я настоятельно рекомендую вам использовать другой язык для вашего сценария. PowerShell был бы хорошим выбором, учитывая, что он является частью последних выпусков Windows и имеет инструменты для управления различными компонентами Windows Server.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .