Как автоматизировать рутинные процессы?

Очень часто приходится писать командные файлы для планировщиков, для автоматизации рутинных задач. Однако очень много времени уходит на их отладку и порой ловишь себя на мысли, что делал это уже много раз.
Предлагаю автоматизировать процесс написания скриптов за счет использования библиотеки функций. Моя разработка будет удобна как для обычных bat-файлов Win98, так и для продвинутых cmd-файлов Win2k.
Часть функций пригодится любому системному администратору, часть - используется для архивирования и обмена данными в УРБД 1С.

Принципы написания скриптов

1. Все скрипты находятся в одном файле. У себя я его называю robot.bat
2. Файл robot.bat cостоит из функций. Эти функции могут вызывать из robot.bat с помощью команды call %0 ИмяФункции Парам1 Парам2.
3. В параметрах robot.bat первым идет имя функции, далее - ее параметры.
4. Некоторые наиболее часто употребляемые параметры (например пути и каталоги) устанавливаются в переменных среды. Поэтому если вы используете Win98, поставьте в свойствах robot.bat самый большой размер для переменных среды. Переменные среды устанавливаются функцией SETTINGS, она вызывается при запуске любой функции из robot.bat Для определенности все каталоги указываются без финального бэк-слэша (\).
5. Для хранения промежуточных данных используется каталог service, путь к которому указывается в Settings.
6. Чтобы скрипты можно было запустить с любого компьютера желательно устанавливать служебные программы (Rar, 1C, Zip) по одному маршруту, например C:\Program Files\
7. Все процедуры пишутся одинаково:

:ИмяФункции

REM -------------------------------------------------------------------------------
REM Ф У Н К Ц И Я :::: ИмяФункции Описание функции
REM -------------------------------------------------------------------------------
....
Операторы функции
.....
goto pend

8. Программа заканчивается меткой pend. Для выхода надо использовать переход на pend, чем exit, т.к. exit убивает полностью скрипт.
9. Для своих часто используемых команд тоже имеет смысл написать функции, тогда вызывать их можно будет просто robot.bat ИмяФункции.

Обзор функций из пакета robot.bat

DATETIME - добавляет в конец указанного файла дату и время (удобна для протоколов)
CHECKMD - проверяет наличие в zip-файле файла 1cv7.md и при наличии такового рассылает сообщения администраторам
UNLOAD1S - создает файл параметров и производит выгрузку данных из 1С в архив
URBD1S - запускает автообмен для 1S
URBDCHK1S - то же, что и URBD1S, но дополнительно контролирует наличие *.MD в пришедшем файле.
В будующем можно написать:
COPYBASE - для копирования одного каталога DBF базы 1С в другой
ARCBASE - для архивирования каталога 1С - каталогов пользователей, файлов MD, DD
REGISTER1S - регистрирует данные для 1С в реестре.

Из опыта применения

На практике я теперь очень быстро могу добавить скрипт для архивирования базы 1С, запуска автообмена и т.п., практически без отладки. Ведется общий протокол, где можно проконтролировать исполнение работ. Рекомендую!

Исходник robot.bat

@echo on
REM Для ускорения работы отключаем сообщения
REM ----------------------------------------------------------------------------------------
REM ***** ***** ***** ***** *****
REM * * * * * * * *
REM * * * * * * * *
REM ***** * * ***** * * *
REM * * * * * * * *
REM * * * * * * * *
REM * ***** ***** ***** *
REM ----------------------------------------------------------------------------------------
REM (C) Robot Osipova, 2003, Osipov Sergey icq:73587347 fixin@mail.ru fixin.by.ru
REM Набор функций для автоматизации задач администрирования 1С:
REM архивирование, автообмены, выгрузки
REM ----------------------------------------------------------------------------------------


REM Устанавливаем переменные среды
goto SETTINGS
:SETTINGS_BACK

goto>nul %1
echo %1 is not valid function name for this program
pause
goto pend

rem Параметры запуска:
rem robot Функция Параметр1 Параметр2 .... ПараметрN
cls

rem Echo >> %genlog% ROBOT.BAT STARTS WITH %1 %2 %3 %4 %5 %6 %7 %8

rem Создаются вспомогательные директории - рабочая директория
md>nul %workdir%


:REGISTER1S
REM ----------------------------------------------------------------------------------------
REM Ф У Н К Ц И Я :::: REGISTER1S Регистрирует путь к 1с И КАТАЛОГИ ОБМЕНА
REM ----------------------------------------------------------------------------------------
rem %2 - Идентификатор базы ID
rem ИСПОЛЬЗУЕТ:
rem workdir - там создается файл параметров запуска 1С и туда же пишется протокол 1S
rem genlog - после завершения работы протокол 1С записывается в конец протокола genlog
rem servdir - оттуда берутся файлы реестра
rem Регистрируется 2 файла (BASE - идентификатор базы): [HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\]
rem 1. BASE_EX - ветка реестра, содержащая данные по базе (в том числе и пути автообмена)
rem сюда нужно полностью выгрузить с компьютера, где все настроено ветку
rem [HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Моя база]
rem 2. BASE_TIT - ветка реестра с заголовком базы, выглядит примерно так
rem [HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles]
rem "\\\\server\\bases\\mybase\\"="Моя база"


rem Вносим данные в реестр
if exist %servdir%\%2_ex.reg regedit /s %servdir%\%2_ex.reg
if exist %servdir%\%2_ex.reg echo >> %genlog% ENTER DATA FOR AUTOEXCHANGE TO REGISTR FROM %servdir%\%2_ex.reg

if exist %servdir%\%2_tit.reg regedit /s %servdir%\%2_tit.reg
if exist %servdir%\%2_tit.reg echo >> %genlog% ENTER TITLE FOR BASE %2 TO REGISTR FROM %servdir%\%2_tit.reg

goto pend



:UNLOAD1S
REM ----------------------------------------------------------------------------------------
REM Ф У Н К Ц И Я :::: UNLOAD1S Выгружает данные из 1S в архив
REM ----------------------------------------------------------------------------------------
rem %2 - Идентификатор базы ID
rem %3 - Каталог базы
rem %4 - Пользователь
rem %5 - Пароль
rem %6 - Файл, куда выгружается база
rem %7 - Пароль файла выгрузки (zip-файла) - необязателен
rem ИСПОЛЬЗУЕТ:
rem workdir - там создается файл параметров запуска 1С и туда же пишется протокол 1S
rem genlog - после завершения работы протокол 1С записывается в конец протокола genlog
rem exe1s - там создается файл параметров
rem Для того, чтобы запустить выгрузку в 1С, нужно создать файл параметров.
ren 1С делает обмен и создает файл результатов




echo> %workdir%\prmun_%2.txt [General]
echo>>%workdir%\prmun_%2.txt Output=%workdir%\repun_%2.txt
echo>>%workdir%\prmun_%2.txt Quit=Y
echo>>%workdir%\prmun_%2.txt CheckAndRepair=N
echo>>%workdir%\prmun_%2.txt UnloadData=Y
echo>>%workdir%\prmun_%2.txt SaveData=N
echo>>%workdir%\prmun_%2.txt AutoExchange=N
echo>>%workdir%\prmun_%2.txt [UnloadData]
echo>>%workdir%\prmun_%2.txt UnloadToFile=%6
if not "%6"=="" echo>>%workdir%\prmun_%2.txt Password=%7


%exe1s% CONFIG /D%3 /N%4 /P%5 /@%workdir%\prmun_%2.txt


echo >> %genlog% =================================================================
echo >> %genlog% 1 S U N L O A D
echo >> %genlog% =================================================================
call %0 DATETIME %genlog%

type %workdir%\repun_%2.txt >>%genlog%

goto pend


:STORE1S
REM ----------------------------------------------------------------------------------------
REM Ф У Н К Ц И Я :::: STORE1S Сохраняет данные каталога 1S в архив
REM ----------------------------------------------------------------------------------------
rem %2 - Идентификатор базы ID
rem %3 - Каталог базы
rem %4 - Файл архива, куда выгружается база
rem %5 - Пароль файла выгрузки (zip-файла) - необязателен
rem ИСПОЛЬЗУЕТ:
rem genlog - после завершения работы протокол 1С записывается в конец протокола genlog
rem exerar - Путь к rar
rem Сохраняет файлы из каталога 1С в архив.

set tmppass=-p%5
if "%5"=="" set tmppass=
%exerar% a -r %4 *.md %3\*.dll %3\*.cfg %3\*.dd? %3\*.dbf %3\*.lst %tmppass%


echo >> %genlog% =================================================================
echo >> %genlog% 1 S STORE
echo >> %genlog% =================================================================
call %0 DATETIME %genlog%

echo Base "%2" in directory %3 store to file %4 >>%genlog%
goto pend

:STORE1SROOT
REM ----------------------------------------------------------------------------------------
REM Ф У Н К Ц И Я :::: STORE1SROOT Сохраняет данные каталога 1S (без DBF) в архив
REM ----------------------------------------------------------------------------------------
rem %2 - Идентификатор базы ID
rem %3 - Каталог базы
rem %4 - Файл архива, куда выгружается база
rem %5 - Пароль файла выгрузки (zip-файла) - необязателен
rem ИСПОЛЬЗУЕТ:
rem genlog - после завершения работы протокол 1С записывается в конец протокола genlog
rem exerar - Путь к rar
rem Сохраняет файлы из каталога 1С в архив.


set tmppass=-p%5
if "%5"=="" set tmppass=

%exerar% a -r %4 %3\*.md %3\*.dll %3\*.cfg %3\*.dd? %3\*.lst %tmppass%


echo >> %genlog% =================================================================
echo >> %genlog% 1 S STORE ROOT
echo >> %genlog% =================================================================
call %0 DATETIME %genlog%

echo Base "%2" in directory %3 store to file %4 >>%genlog%

goto pend



:URBD1S
REM ----------------------------------------------------------------------------------------
REM Ф У Н К Ц И Я :::: URBD1S Производит обмен данными в УРБД 1С
REM ----------------------------------------------------------------------------------------
rem %2 - Идентификатор базы ID
rem %3 - Каталог базы
rem %4 - Пользователь
rem %5 - Пароль
rem %6 - Строка ReadFrom
rem %7 - Строка WriteTo
rem ИСПОЛЬЗУЕТ:
rem workdir - там создается файл параметров запуска 1С и туда же пишется протокол 1S
rem genlog - после завершения работы протокол 1С записывается в конец протокола genlog
rem exe1s - там создается файл параметров
rem Для того, чтобы запустить обмен в 1С, нужно создать файл параметров.
ren 1С делает обмен и создает файл результатов

echo> %workdir%\prmex_%2.txt [General]
echo>>%workdir%\prmex_%2.txt Output=%workdir%\repex_%2.txt
echo>>%workdir%\prmex_%2.txt Quit=Y
echo>>%workdir%\prmex_%2.txt CheckAndRepair=N
echo>>%workdir%\prmex_%2.txt UnloadData=N
echo>>%workdir%\prmex_%2.txt SaveData=N
echo>>%workdir%\prmex_%2.txt AutoExchange=Y
echo>>%workdir%\prmex_%2.txt [AutoExchange]
echo>>%workdir%\prmex_%2.txt ReadFrom=%6
echo>>%workdir%\prmex_%2.txt WriteTo=%7
echo>>%workdir%\prmex_%2.txt SharedMode=1

%exe1s% CONFIG /D%3 /N%4 /P%5 /@%workdir%\prmex_%2.txt

echo >> %genlog% =================================================================
echo >> %genlog% U R B D 1 S E X C H A N G E
echo >> %genlog% =================================================================
call %0 DATETIME %genlog%

type %workdir%\repex_%2.txt >>%genlog%

goto pend




:ARCDIR
REM ----------------------------------------------------------------------------------------
REM Ф У Н К Ц И Я :::: ARCDIR Упаковывает каталог с данными в режиме апдейт
REM ----------------------------------------------------------------------------------------
rem %2 - Каталог
rem %3 - файл архива, куда будет положена упаковка

rem ИСПОЛЬЗУЕТ:
rem exerar - путь к архиватору


%exerar% a -r %3 %2\*.*

goto pend



:URBDCHK1S

REM ----------------------------------------------------------------------------------------
REM Ф У Н К Ц И Я :::: URBDCHK1S Производит обмен данными в УРБД 1С и проверку на MD
REM ----------------------------------------------------------------------------------------
rem %2 - Идентификатор базы ID
rem %3 - Каталог базы
rem %4 - Пользователь
rem %5 - Пароль
rem %6 - Строка ReadFrom
rem %7 - Строка WriteTo
rem %8 - Путь файла загрузки (в нем проверяется MD-файл

rem Вызывает функцию CHECKMD & URBDCHK1S (смотри их параметры)

call %0 CHECKMD %3 %8
call %0 URBD1S %2 %3 %4 %5 %6 %7

goto pend



:DATETIME
REM ----------------------------------------------------------------------------------------
REM Ф У Н К Ц И Я :::: DATETIME Выводит в конец файла протокола текущую дату и время
REM ----------------------------------------------------------------------------------------
rem %2 - Имя файла протокола
rem ИСПОЛЬЗУЕТ: workdir
rem Для вывода используется
rem В каталоге workdir создает nl.txt содержащий перевод строки

if not "%1"=="DATETIME" goto not_datetime
echo. >%workdir%\nl.txt
date <%workdir%\nl.txt >>%2
time <%workdir%\nl.txt >>%2
goto pend

:CHECKMD
REM ----------------------------------------------------------------------------------------
REM Ф У Н К Ц И Я :::: CHECKMD Проверка наличия MD-файла
REM ----------------------------------------------------------------------------------------
rem :: :: Проверяем наличие md-файла
rem %2 - Каталог базы (без слэша)
rem %3 - Полное имя (с путем) файла обмена
rem Если база не занята - проверка не нужна
rem ИСПОЛЬЗУЕТ: admins, exepkunzip

if not exist %2\1cv7.lck goto pend
rem Распаковываем файл обмена
md %2\check_md
cd %2\check_md
del %2\check_md\1cv7.md
%exepkunzip% -e %3 %2\check_md\ 1cv7.md
if not exist %2\check_md\1cv7.md goto checkmd_no_md
rem Рассылаем сообщение
for %%i in (%admins%) do net send %%i MD-file detected in file %3 for base %2 Kill a ll users and restart autoexchange in URBD !!!
goto pend
:checkmd_no_md
echo MD not found, ok
goto pend










:SETTINGS
rem Устанавливаем переменные среды
REM @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
REM @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
REM Ф У Н К Ц И Я :::: Установка рабочих переменных среды
REM @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
REM @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
rem Внимание !!! Все каталоги указывать без финального слэша !!! Например C:\base

rem Полный путь к программе 1С
set exe1s="\\server\BIN\1cv7s.exe"

rem Полный путь к архиватору rar.exe
set exerar="C:\Program Files\WinRar\rar.exe"

rem Полный путь к распаковщику pkunzip.exe
set exepkunzip="\\server\service\pkunzip.exe"

rem Каталог для временных файлов
set workdir=\\server\service\wrk

rem Путь к командным файлам (и к текущему файлу тоже)
set servdir=\\server\service

rem Администраторы - список через точку с запятой - им будут рассылаться сообщения
set admins=OSergey Администратор Admin

rem Генеральный протокол для всех сообщений
set genlog=\\server\service\genlog.txt

rem Каталог, куда складываются архивы
set arcdir=\\server\arc

rem Список компьтеров, данные с которых нужно архивировать
set computersforarc=server01;server02;user1;user2;user3


goto SETTINGS_BACK



REM @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
REM @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
REM Ф У Н К Ц И И П О Л Ь З О В А Т Е Л Я
REM @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
REM @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@




rem Последняя строчка - указатель на конец программы
:pend