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

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