Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Старожил


Сообщения: 426
Благодарности: 108

Профиль | Отправить PM | Цитировать


Цитата Ingolder:
Вы не могли бы как-то всё прокомментировать для тех, кто не очень? А т оя не очень.. »
Чтож, попробую, понимаю как сложно без понятного примера разбираться в чем-то новом:

Откючаем эхо команд (чтоб сам скрип на экране не выводился) и разрешаем "новшества" в командах от Большого Билла
Код: Выделить весь код
@Echo off
SetLocal EnableExtensions
Самое простое - указываем какой файл копируется и куда он копируется.
Код: Выделить весь код
Set File=C:\1\MyFile.dat
Set BackUp=C:\2\
Сообщение для лог-файла "по-умолчанию"
Код: Выделить весь код
set Msg=Nothing to do
Стандартная "макрокоманда" для получения тек. даты и времени в формате YYYY-MM-DD_HH-MM-SS (если в винде указать, что мы находимся в штатах, то работать не будет - там дата имеет вид MM/DD/YYYY). Первая строчка из переменной %time% (формат примерно такой: 20:30:19,54) заменяет все ":" на "-" и кладет в переменную %tm%.
Вторая строчка использует переменную %date% вида 07.12.2009 и из нее строит готовый текст, состоящий из: 4х символов с 6й позиции (год) + символ "-" + 2 символа с 3й позиции (месяц) + "-" + 2 символа с 0й позиции (число) + "_" + уже полученное время (вида 20-30-19,54, где ":" заменено на "-") без 3х последних символов. (уфф) * см. set /?
Код: Выделить весь код
set tm=%time::=-%
set tm=%date:~6,4%-%date:~3,2%-%date:~0,2%_%tm:~0,-3%
Таким же образом берем из нашей даты %tm% 2 символа с текущим числом и проверяем, что сегодняшнее число меньше 20 ("LSS"="LeSS then", см. if /?). Если да - на выход, где выводится уже готовое сообщение в лог-файл.
Код: Выделить весь код
set Chk=%tm:~8,2%
if /I %Chk% LSS 20 Goto End
Получаем от текущей даты первые 7 символов - год и месяц - будем их искать в лог-файле в строках с успешной синхронизацией.
Код: Выделить весь код
set Chk=%tm:~0,7%
Выполняем внешнюю команду FindStr, которая ищет строку в файле(ах). Ключ /I говорит игнорировать регистр, а ключ /c:"" ищет указанную строку "строго", т.е. с указанными пробелами, не разрывая слова. И ищется все это в файле, полученном из имени батника (%0 - сам батник): модификатор d говорит взять имя диска, где лежит батник, p - путь, а n - имя батника без расширения, ну а разширение добавляем .log. Таким образом если %0 дает что-нить типа "FileSinc.bat", то %~dpn0.log выдаст с полным путем "D:\BackUp\FileSinc.log". (см. "call /?" и "for /?").
Но результат поиска будет выведен на экран, а нам надо затолкать его в переменные и анализировать. Поэтому команда вызывается внутри цикла, рабирающего строку или читающего текстовые файлы или перехватывающего вывод на экран (как в данном случае). В цикле сказано, что данные разделены на "столбцы" символом ":" (delims) и что нас интересует первый столбец в первой переменной (%%D), а второй и все остальные ("2*") столбцы - во вторую переменную (по алфавиту это будет %%E). (*задним числом можно сказать, что нам плевать на остальные столбцы - думал те данные понадобятся) Цикл пройдет по всем строкам, где FindStr нашел отметку об успешном копировании и первый столбец (с датой) по очереди положит в переменную %Last%. В итоге получим дату самого-присамого последнего копирования:
Код: Выделить весь код
for /f "Tokens=1,2* Delims=:" %%D in ('FindStr /i /c:"Synchronization Done" %~dpn0.log') do set Last=%%D
Оставляем от даты последнего копирования только первые 7 символов - год и месяц.
Если год и месяц текущей даты и даты последнего копирования совпадают, значит копирование в этом месяце уже было и ничего не нужно делать - переходим в конец с уже заготовленным сообщением "Nothing to do".
Код: Выделить весь код
set Last=%Last:~0,7%
if "%Chk%"=="%Last%" Goto End
Копируем файл без запроса на перезапись уже имеющегося файла (ключ /Y).
Если Код Выхода команды (Код Ошибки) Copy равен нулю - значит все прошло успешно (готовим соответствующее сообщение), в противном случае готовим другое сообщение, куда по-хорошему можно было добавить сам код ошибки (например 2="файл не найден" и т.д. - коды ошибок можно посмотреть в иНете. Особенность: переменную с Кодом Ошибки можно прочитать только раз - в следующий раз там будет результат, которым закончилось само чтение Кода Ошибки!)
Код: Выделить весь код
copy /y %File% %BackUp%
if %ErrorLevel%==0 (set Msg=Synchronization Done
) else set Msg=Synchronization Failed !!!
Собственно все - вывод текущей даты с двоеточием на конце и текстом уже подготовленного сообщения в лог-файл *метки для перехода в батч-файлах начинаются с двоеточия. Некоторые "товарисчи" используют этот символ в качестве ремарки вместо команды rem. Это мовитон, использует лишние ресурсы (все метки интерпретатор должен помнить) и может привести к ошибке "на невнимательность".
Код: Выделить весь код
:End
echo %tm%: %Msg%>>%~dpn0.log

Отправлено: 21:28, 07-12-2009 | #8