Цитата Ingolder:
Вы не могли бы как-то всё прокомментировать для тех, кто не очень? А т оя не очень.. »
|
Чтож, попробую, понимаю как сложно без понятного примера разбираться в чем-то новом:
Откючаем эхо команд (чтоб сам скрип на экране не выводился) и разрешаем "новшества" в командах от Большого Билла
Код:
![Выделить весь код](images/misc/selectcode.png)
@Echo off
SetLocal EnableExtensions
Самое простое - указываем какой файл копируется и куда он копируется.
Код:
![Выделить весь код](images/misc/selectcode.png)
Set File=C:\1\MyFile.dat
Set BackUp=C:\2\
Сообщение для лог-файла "по-умолчанию"
Код:
![Выделить весь код](images/misc/selectcode.png)
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 /?
Код:
![Выделить весь код](images/misc/selectcode.png)
set tm=%time::=-%
set tm=%date:~6,4%-%date:~3,2%-%date:~0,2%_%tm:~0,-3%
Таким же образом берем из нашей даты
%tm% 2 символа с текущим числом и проверяем, что сегодняшнее число меньше 20 ("LSS"="LeSS then", см.
if /?). Если да - на выход, где выводится уже готовое сообщение в лог-файл.
Код:
![Выделить весь код](images/misc/selectcode.png)
set Chk=%tm:~8,2%
if /I %Chk% LSS 20 Goto End
Получаем от текущей даты первые 7 символов - год и месяц - будем их искать в лог-файле в строках с успешной синхронизацией.
Код:
![Выделить весь код](images/misc/selectcode.png)
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%. В итоге получим дату самого-присамого последнего копирования:
Код:
![Выделить весь код](images/misc/selectcode.png)
for /f "Tokens=1,2* Delims=:" %%D in ('FindStr /i /c:"Synchronization Done" %~dpn0.log') do set Last=%%D
Оставляем от даты последнего копирования только первые 7 символов - год и месяц.
Если год и месяц текущей даты и даты последнего копирования совпадают, значит копирование в этом месяце уже было и ничего не нужно делать - переходим в конец с уже заготовленным сообщением "Nothing to do".
Код:
![Выделить весь код](images/misc/selectcode.png)
set Last=%Last:~0,7%
if "%Chk%"=="%Last%" Goto End
Копируем файл без запроса на перезапись уже имеющегося файла (ключ
/Y).
Если Код Выхода команды (Код Ошибки)
Copy равен нулю - значит все прошло успешно (готовим соответствующее сообщение), в противном случае готовим другое сообщение, куда по-хорошему можно было добавить сам код ошибки (например 2="файл не найден" и т.д. - коды ошибок можно посмотреть в иНете.
Особенность: переменную с Кодом Ошибки можно прочитать только раз - в следующий раз там будет результат, которым закончилось само чтение Кода Ошибки!)
Код:
![Выделить весь код](images/misc/selectcode.png)
copy /y %File% %BackUp%
if %ErrorLevel%==0 (set Msg=Synchronization Done
) else set Msg=Synchronization Failed !!!
Собственно все - вывод текущей даты с двоеточием на конце и текстом уже подготовленного сообщения в лог-файл *метки для перехода в батч-файлах начинаются с двоеточия. Некоторые "
товарисчи" используют этот символ в качестве ремарки вместо команды
rem. Это мовитон, использует лишние ресурсы (все метки интерпретатор должен помнить) и может привести к ошибке "на невнимательность".
Код:
![Выделить весь код](images/misc/selectcode.png)
:End
echo %tm%: %Msg%>>%~dpn0.log