Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УЧЕБНАЯ ПРАКТИКА120625.doc
Скачиваний:
4
Добавлен:
27.09.2019
Размер:
527 Кб
Скачать
☆

4. Командные файлы

Нам придется много раз компилировать программы, написанные на языке С. Достаточно утомительно каждый раз переписывать все параметры командной строки. Поэтому мы составим командный файл, который будет запускать компилятор в пакетном режиме. Этот файл также создается при помощи редактора notepad.exe, он должен иметь расширение .bat. Так как его основная работа – запуск компилятора bcc32.exe, то назовем его bcc.bat.

Наберем команду

notepad.exe bcc.bat,

подтвердим создание нового файла и введем в редактор следующий тект:

rem bcc.bat

if “%1”==“” goto error

path C:\Test\Bcc

bcc32.exe -I“C:\Test\Include” -L“C:\Test\Lib” %1.c

goto end

:error

echo Вы забыли указать имя программы (без расширения .c)

:end

Этот файл написан не на языке С, а на командном языке сеанса MS DOS. Его не надо компилировать, операционная система читает одну команду за другой и выполняет их. Расширение bat происходит от слова batch – пакет, оно означает, что файл выполняет группу команд как единое целое. Первая строка командного файла начинается со слова rem, это – начало комментария, концом комментария служит перевод строки. Как мы договорились, комменатрий должен содержать имя файла. Вторая строка содержит конструкцию %1; так обозначается аргумент пакетного файла. Теперь составим программу

/* prog2.c */

main()

{

return 2;

}

Если мы наберем в командной строке

bcc.bat prog2

то %1 будет именем слова prog2. Когда в командной строке стоит только имя пакетного файла bcc.bat аргумент пустой, “%1” - это просто пара двойных кавычек, два знака == - отношение равенства. Слово if служит началом оператора ветвления в пакетном файле, его формат

if [ NOT ] строка1 == строка2 команда

Операция NOT обращает истинность условия: истинное условие становится ложным, а ложное – истинным. Условие

строка1 == строка2

является истинным, когда эти строки совпадают, в этом случае оператор выполняет команду, стоящую после условия.

Слово NOT заключено в квадратные скобки, это означает, что оно является необязательной частью конструкции. Команду

if %1”==“” goto error

следует понимать так: если командный файл запущен с пустым аргументом, то выполняются команды, стоящие после метки error. Эту метку мы увидим ниже, двоеточие, с которого начинается строка с меткой, указывает, что error – метка, а не команда. За этой строкой находится строка с командой echo, она выводит на экран сообщение, напоминающее пользователю, что пакетный файл запускается с аргументом.

Если пользователь ввел аргумент – имя программы, то вместо перехода на метку error выполняется команда

path C:\Test\Bin

- теперь операционная система будет искать исполняемые файлы лишь в текущей директории и в директории Bin. Часто студенты говорят, что эта команда не нужна, «программа компилируется и так». На самом деле это означает, что список директорий поиска исполняемых файлов содержит путь к директории Bin пакета CBuilder, так что компилятор и компоновщик вызываются оттуда, откуда мы их копировали.

Следующая строка – вызов компилятора bcc32.exe с параметрами, указывающими имена директорий включаемых файлов и библиотек. Аргументом компилятора служит имя программы, в нашем случае – это аргумент пакетного файла %1. У любого файла с исходным текстом на языке С должно быть расширение .с; чтобы не повторять его каждый раз, мы передаем пакетному файлу имя файла - программы без расширения, а имя с расширением появляется при помощи конструкции %1.с. Команда безусловного перехода goto end позволяет обойти сообщение об ошибке, следующее за меткой error. После метки end команд нет, выполнение пакетного файла завершается.

В ходе выполнения пакетного файла на экран выводятся команды, которые он выполняет. Чтобы подавить их вывод используйте конструкцию

@echo off

(символ @ подавляет вывод на экран самой команды echo off):

rem bcc.bat

@echo off

if “%1”==“” goto error

path C:\Test\Bcc

bcc32.exe -I“C:\Test\Include” -L“C:\Test\Lib” %1.c

goto end

:error

echo Вы забыли указать имя программы (без расширения .c)

:end

Задание. Составьте пакетный файл bcc.bat и убедитесь, что он корректно работает.

Код, который программа возвращает операционной системе в момент завершения, позволяет эмулятору командной строки управлять последовательностью выполнения команд пакетного файла. Для этого используется конструкция errorlevel. Оператор ветвления с этой конструкцией имеет такой формат:

"if [ NOT ] ERRORLEVEL число команда.

Условие

ERRORLEVEL число

является истинным, если код возврата последней выполненной программы не меньше указанного числа.

Составим пакетный файл

rem test.bat

@echo off

prog2.exe

if ERRORLEVEL %1 echo Код возврата не меньше, чем %1

Исполняемый файл prog2.exe, полученный в результате компиляции программы prog2.c, возвращает операционной системе число 2 и завершается. Напомним, что программа test.bat представляет собой пакетный файл, её не надо компилировать. Запустим файл test/bat с аргументом 0:

test. bat 0

Первая команда после @echo off запускает файл prog2.exe.

Следующая команда состоит из двух частей. Первая часть - if ERRORLEVEL %1 - проверяет код возврата завершившейся программы и сравнивает его с аргументом - в нашем случае аргумент равен 0. Так как код возврата 2 не меньше, чем 0, то выполняется вторая часть: команда echo выводит на экран стоящее после неё сообщение: "Код возврата не меньше, чем 2". Запустим пакетный файл, увеличив аргумент:

test.bat 1.

На экране появится сообщений "Код возврата не меньше, чем 1". Запустим пакетный файл test.bat с аргументом 2. Условие ERRORLEVEL %1 по-прежнему будет истинным: 2 не меньше, чем 2. Команда echo выводит на экран сообщение: "Код возврата не меньше, чем 2". А после запуска

test.bat 3

на экране не появится никаких сообщений: код возврата 2 меньше, чем 3.

Задание. Cоставьте пакетный файл

rem test.bat

@echo off

prog2.exe

if NOT ERRORLEVEL %1 echo %1

Объясните результат выполнения следующих команд:

test.bat 0

test.bat 1

test.bat 2

test.bat 3