© Иван Рощин, Москва
| ZXNet | : 500:95/462.53 |
| : bestview@mtu-net.ru | |
| WWW | : http://www.ivr.da.ru |
(«Мир ПК» 4/2007)
Рассмотрим такую ситуацию. В некотором каталоге есть два
Случайно запустить не тот файл вполне возможно:
Идея весьма проста. Изменим
Для реализации изложенного в начало файла 1.bat добавляем следующие строки:
@if not exist after_1.$$$ goto order_ok @echo Неправильный порядок запуска файлов! @goto end :order_ok @echo >after_1.$$$
В начало файла 2.bat добавляем:
@if exist after_1.$$$ goto order_ok @echo Неправильный порядок запуска файлов! @goto end :order_ok @del after_1.$$$
И в конец обоих файлов добавляем метку end:
:end
Разумеется, если в редактируемом
Также отмечу, что сообщение «Неправильный порядок запуска
файлов!» должно быть записано в кодировке DOS, т.к. именно в ней
происходит вывод на экран при выполнении
Как вы помните, для расположения временного файла был выбран текущий
каталог, значит, при запуске обоих
Итак, эта задача решена, а теперь обобщим её на случай
произвольного числа
Ниже показано, какие строки нужно добавить в
В начало файла 1.bat добавляем:
@if exist after_1.$$$ goto order_err @if exist after_2.$$$ goto order_err @goto order_ok :order_err @echo Нарушен порядок запуска файлов! @goto end :order_ok @echo >after_1.$$$
В начало файла 2.bat добавляем:
@if exist after_1.$$$ goto order_ok @echo Нарушен порядок запуска файлов! @goto end :order_ok @del after_1.$$$ @echo >after_2.$$$
В начало файла 3.bat добавляем:
@if exist after_2.$$$ goto order_ok @echo Нарушен порядок запуска файлов! @goto end :order_ok @del after_2.$$$
В конец каждого из этих трёх файлов добавляем, как и в прошлом случае, метку end.
Кстати, обратите внимание на первые строки, добавляемые в начало файла 1.bat:
@if exist after_1.$$$ goto order_err @if exist after_2.$$$ goto order_err @goto order_ok :order_err
Тут можно было бы записать короче (вторую и третью строку заменить одной):
@if exist after_1.$$$ goto order_err @if not exist after_2.$$$ goto order_ok :order_err
Почему я выбрал более длинный вариант? В первую очередь потому, что так
понятнее, а к тому же если вдруг, скажем, понадобится увеличить количество
@if exist after_1.$$$ goto order_err @if exist after_2.$$$ goto order_err @if exist after_3.$$$ goto order_err <-- добавленная строка @goto order_ok :order_err
А в более коротком варианте пришлось бы добавить одну строку и отредактировать другую:
@if exist after_1.$$$ goto order_err @if exist after_2.$$$ goto order_err <-- добавленная строка @if not exist after_3.$$$ goto order_ok <-- отредактированная строка :order_err
То есть редактирование в этом случае оказалось бы более сложным.
Автоконтроль может быть применён и при нелинейном порядке запуска файлов (когда есть ветвления и/или циклы). При этом, однако, не обеспечивается распознавание всех ошибок. Рассмотрим пример:
Здесь после файла a.bat может быть запущен либо b.bat, либо c.bat, а группа из файлов c.bat и d.bat может быть выполнена многократно. Какие же действия должны производиться в каждом из этих файлов для автоконтроля?
Смотрим на схему. Так как после выполнения b.bat или e.bat обработка данных заканчивается, то при их выполнении временные файлы создавать не нужно. Остаются a.bat, c.bat и d.bat вот при их выполнении и будут создаваться временные файлы, назовём их соответственно after_a.$$$, after_c.$$$ и after_d.$$$.
Временный файл должен существовать лишь в промежутке между запуском того
Теперь определим, какие в каком файле должны производиться проверки. При запуске a.bat, то есть при начале обработки данных, не должно быть ни after_a.$$$, ни after_c.$$$, ни after_d.$$$. Файл b.bat должен быть запущен только после a.bat значит, при его запуске должен существовать файл after_a.$$$. Файл c.bat должен быть запущен либо после a.bat, либо после d.bat значит, при его запуске должен существовать либо файл after_a.$$$, либо after_d.$$$. Файл d.bat должен быть запущен только после c.bat значит, при его запуске должен существовать файл after_c.$$$. Файл e.bat должен быть запущен только после d.bat значит, при его запуске должен существовать файл after_d.$$$.
Ниже показано, какие строки нужно добавить в
В начало файла a.bat добавляем:
@if exist after_a.$$$ goto order_err @if exist after_c.$$$ goto order_err @if exist after_d.$$$ goto order_err @goto order_ok :order_err @echo Нарушен порядок запуска файлов! @goto end :order_ok @echo >after_a.$$$
В начало файла b.bat добавляем:
@if exist after_a.$$$ goto order_ok @echo Нарушен порядок запуска файлов! @goto end :order_ok @del after_a.$$$
В начало файла c.bat добавляем:
@if exist after_a.$$$ goto order_ok @if exist after_d.$$$ goto order_ok @echo Нарушен порядок запуска файлов! @goto end :order_ok @if exist after_a.$$$ del after_a.$$$ @if exist after_d.$$$ del after_d.$$$ @echo >after_c.$$$
В начало файла d.bat добавляем:
@if exist after_c.$$$ goto order_ok @echo Нарушен порядок запуска файлов! @goto end :order_ok @del after_c.$$$ @echo >after_d.$$$
В начало файла e.bat добавляем:
@if exist after_d.$$$ goto order_ok @echo Нарушен порядок запуска файлов! @goto end :order_ok @del after_d.$$$
И, как обычно, в конец каждого из этих файлов добавляем метку end.
В данном примере ошибка, когда после запуска a.bat запускается b.bat вместо c.bat или наоборот, не может быть распознана средствами автоконтроля, ведь оба варианта считаются допустимыми. Аналогично не может быть распознана ошибка, когда после запуска d.bat запускается c.bat вместо e.bat или наоборот.
И под конец рассмотрим ещё один вопрос. Как быть, если нужно
контролировать порядок запуска не только
Для запуска каждого
|
Другие мои статьи о
|