Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Dos7book

.pdf
Скачиваний:
75
Добавлен:
09.02.2015
Размер:
5.1 Mб
Скачать

Глава 3: Команды интерпретатора Command.com

сообщение от второй операции не индицируется на экране, а попадает в файл вслед за сообщением от первой операции:

For %%Z in ("echo 1-st line >> Q.txt" "echo 2-nd line") do %%Z

Изменить перенаправление в последующих операциях цикла можно, но его нужно указать явно.

Способность цикла FOR не включать знаки двойных кавычек в значение переменной цикла полезна для обеспечения правильной индикации сообщений,

состоящих из нескольких слов и предохраняемых от разделения в промежуточных операциях посредством заключения в двойные кавычки.

Вложенные циклы FOR не допускаются, но тем не менее возможны, если внутренний цикл FOR исполняется отдельным резидентным модулем командного интерпретатора COMMAND.COM, запускаемым из внешнего цикла FOR, указываемого в той же командной строке. Еще одна возможность состоит в том, чтобы из внешнего цикла FOR командой CALL запустить на исполнение batch-файл, в котором содержатся другие циклы FOR.

Примечание 1: имя переменной цикла должно быть выбрано так, чтобы исключить совпадения с другими именами используемых переменных.

Примечание 2: в пределах скобок цикла FOR знак косой черты ( / ) играет роль особого сепаратора: следующие за ним буквы преобразуются в заглавные, и вместе с самим знаком косой черты образуют отдельное слово, задающее одно из значений переменной цикла. В прежних версиях DOS действие знака косой черты было иным.

Примечание 3: попытки извне перенаправить сразу все сообщения, выводимые из цикла FOR, воздействуют только на первую операцию в этом цикле. Если для последующих операций перенаправления не указаны, то для них будут действовать установки, принимаемые по умолчанию.

Примечание 4: когда резидентный модуль командного интерпретатора COMMAND.COM запускается из командной строки специально для исполнения цикла FOR, то там имени переменной цикла должны предшествовать два знака процента, так же, как в batch-файлах.

3.14GOTO – команда перехода на метку

Команда GOTO (GO TO = идти к) используется в batch-файлах для выполнения переходов на метку, которая должна быть записана в одной из строк того же batch-файла. Строка с меткой начинается с двоеточия ( : ), после которого следует произвольное имя метки. Для перехода на эту метку то же самое имя должно быть указано после команды GOTO. В длинных именах меток принимаются во внимание только первые 8 знаков. Наличие нескольких одноименных меток в

– 61 –

Глава 3: Команды интерпретатора Command.com

одном batch-файле не допускается. Например, если в одной из строк batch-файла имеется метка :L36, то команду перехода на эту метку следует записать так:

GOTO L36

Для исполнения условных переходов команде GOTO в той же строке может предшествовать оператор условия IF (3.15). Большое количество примеров условных и безусловных команд перехода имеется в batch-файлах, приведенных в

разделах 9.03-02, 9.09-02.

 

Примечание 1: в строке с командой

GOTO имя метки может быть получено

посредством замещения имени переменной (например, %VAR%) ее

значением (2.03-03).

 

Примечание 2: в строке с командой

GOTO в качестве имени метки нельзя

указывать подстановку значения формального параметра (%1, %2..), но ее можно использовать в составе имени метки, если подстановке предшествует хотя бы одна буква.

Примечание 3: переход по метке не изменяет код ошибки (errorlevel), так что проверки кода ошибки могут быть продолжены после перехода.

3.15IF – оператор условия

Оператор условия IF (= если) позволяет проверять три вида условий: условия существования, условия равенства и условия превышения заданного значения кода ошибки (errorlevel).

В общем случае командная строка с условным исполнением какой-либо операции начинается с оператора условия IF, за которым следует идентификатор вида условия, формулировка условия, и затем полная спецификация той команды, которую надлежит выполнить в случае удовлетворения условия. В одной строке можно последовательно размещать несколько операторов условия, и в таком случае общий результат получается путем выполнения логической операции И ( AND ) над частными результатами проверки отдельных условий. Примеры комбинирования нескольких условий приведены в разделах 3.15-03, 9.03-01, 9.09-02. Ниже рассмотрены особенности композиции командных строк с оператором IF для осуществления проверки каждого из видов условий.

3.15-01 Оператор условия IF: проверка существования

Проверка существования применима к файлам, каталогам и логическим устройствам. Она выполняется командой IF EXIST (= если существует). Инверсия этого условия, то есть проверка отсутствия, обеспечивается командой IF NOT EXIST. Вот два примера применения проверки существования по отношению к файлу:

– 62 –

Глава 3: Команды интерпретатора Command.com

IF EXIST C:\DOS\Format.com C:\DOS\Format.com A: /S

IF NOT EXIST C:\DOS\Format.com ECHO Format.com hasn't been found!

здесь:

EXIST

зарезервированное слово, определяющее проверку условия

 

существования и интерпретацию ближайшего следующего

 

элемента как имени или маски искомого объекта.

C:\DOS\Format.com

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

 

путем. Поскольку путь указан, поиск будет производиться только

 

согласно этому пути. Если путь не указан, то поиск будет

 

производиться только в текущем каталоге.

C:\DOS\Format.com A: /S

пример вызова программы, которая будет

 

запущена на исполнение, если предшествующее условие

 

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

 

параметры, необходимые для ее исполнения. Если перед именем

 

этой программы не указывать путь, то будет предпринят ее

 

поиск сначала в текущем каталоге, а потом по всем путям,

 

записанным в значение переменной %PATH%.

NOT

зарезервированное слово, вызывающее логическую инверсию

результата, возвращаемого после проверки условия. ECHO Format.com hasn't been found! – еще один пример команды,

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

Приведенные примеры обеспечивают исполнение указываемой программы (FORMAT.COM), если ее удается найти в должном месте, или получение понятного сообщения, если она там не найдена.

Имена логических устройств считаются зарезервированными словами (2-01-01), назначаемыми ядром DOS или драйверами в процессе загрузки. Путем проверки существования имени логического устройства можно выяснить, загружен ли соответствующий драйвер. Полный список заявленных в Вашем компьютере имен логических устройств можно посмотреть с помощью программы MEM.EXE (6.17), если ее запустить с параметром /D. Например, драйвер EMM386.EXE (5.04-02) резервирует имя логического устройства EMMXXXX0. Поэтому проверить факт его загрузки можно посредством следующей командной строки:

IF NOT EXIST EMMXXXX0 ECHO The EMM driver isn't loaded!

Если в имени искомого объекта содержатся знаки подстановки (2.01-03), то оно интерпретируется как маска файла, и тогда проверка существования будет производиться только по соответствующим файлам, не включая каталоги и имена логических устройств. Условие существования с маской *.* (все файлы) удовлетворяется, если в каталоге существует хотя бы один файл (пример в разделе

– 63 –

Глава 3: Команды интерпретатора Command.com

3.09). Чтобы проверить существование каталога, нужно вместо имени искомого файла использовать зарезервированное слово NUL:

IF EXIST C:\DOS\NUL ECHO The C:\DOS directory exists!

К сожалению, подобные проверки применительно к оптическим дискам CD-ROM могут дать неверный результат вследствие особенностей используемой там файловой системы ISO 9660.

При необходимости обеспечить безостановочное исполнение batch-файлов следует иметь ввиду, что проверка существования файлов и каталогов выполняется безостановочно только на доступных носителях. Файл или каталог могут не существовать, но диск, к которому происходит обращение, должен существовать и быть доступен, то есть должен быть вставлен в дисковод и отформатирован в соответствии с такой файловой системой, которая доступна для MS-DOS7 непосредственно (FAT12, FAT16 и FAT32) или хотя бы с помощью устанавливаемых драйверов. Если заранее неизвестно, доступен ли данный носитель, то безостановочное исполнение проверок существования файлов или каталогов на нем тоже возможно, но требует принятия мер по предотвращению вызова обработчика критических ошибок (8.02-84) и по блокированию выдачи неуместных сообщений (пример в разделе 9.03-02).

3.15-02 Оператор условия IF: проверка равенства

Условие равенства идентифицируется по наличию двух слов, отделенных друг от друга сдвоенным знаком равенства ( = = ). Поскольку бессмысленно сравнивать априори известные слова, постольку условие равенства предполагает

осуществление одной или нескольких подстановок либо вместо наименований формальных параметров, либо вместо имен переменных окружения (2.03-03).

Вопросительный знак и звездочка в сопоставляемых словах не интерпретируются как знаки подстановки (2.01-03), но допускаются на правах обычных букв. Вопреки обычной практике MS-DOS, строчные и заглавные буквы в сопоставляемых словах не считаются равнозначными. Вот два примера использования проверок условия равенства batch-файлах:

IF %VAR%==%2 GOTO L23

IF NOT %VAR%==%2 GOTO HELP

здесь:

%VAR% – имя переменной VAR, окруженное знаками процента, означает,

что в ходе исполнения оно должно быть заменено значением этой переменной.

%2 – цифра с предшествующим знаком процента интерпретируется как номер формального параметра, который в ходе исполнения должен быть заменен значением этого формального параметра.

– 64 –

Глава 3: Команды интерпретатора Command.com

GOTO L23 – пример команды, которую надлежит выполнить, если будет

 

удовлетворено условие равенства значений указанной

 

переменной ( VAR ) и указанного формального параметра.

NOT

зарезервированное слово, означающее логическую инверсию

результата, возвращаемого проверкой условия.

GOTO HELP – пример команды, которую надлежит выполнить, если проверяемое условие не выполняется.

Конечно, любое из сопоставляемых слов может быть задано явно, без подстановок. Нередко по крайней мере одно из сопоставляемых слов представляет собой объединение явно заданной части с одной или несколькими подстановками. Но нельзя допускать, чтобы место сопоставляемого слова осталось пустым: это считается синтаксической ошибкой. Между тем любой batch-файл потенциально может быть запущен на исполнение без параметров, и тогда вместо замещаемого наименования формального параметра не будет подставлено ничего. Переменные окружения также могут иметь пустое значение. При таких обстоятельствах показанный выше пример условия равенства вполне может оказаться ошибочным. Простейший способ исправить ситуацию состоит в том, чтобы приписать какой-либо знак например, точку к обоим сопоставляемым словам:

IF %VAR%.==%2. GOTO L23

IF NOT %VAR%.==%2. GOTO HELP

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

же принцип используется для построения проверок наличия значения переменной окружения или формального параметра:

IF .==%CASH%. ECHO The CASH variable has an empty value

Особенно внимательно следует подходить к построению условий равенства, когда подставляемое значение переменной окружения может содержать пробелы. Пробелы в слове справа от сдвоенного знака равенства не допускаются. Если значение переменной CASH в приведенном выше примере содержало бы пробелы, то это было бы расценено как синтаксическая ошибка. Но слева от сдвоенного знака равенства допускается подстановка значений переменной, состоящих из нескольких разделенных пробелами слов. В таких случаях только первое, самое левое из этих слов будет принято во внимание при сопоставлении. Эти особенности иллюстрированы приводимыми ниже тремя примерами:

IF NOT A: B: C:.==. ECHO Compared items (A: and a dot) are not equal IF .A: B: C:==.A: ECHO Compared items (.A: and .A:) are equal

IF . B: C:==. ECHO Compared items (dots) are equal too

– 65 –

Глава 3: Команды интерпретатора Command.com

В первой строке сопоставляются A: слева и знак точки справа, во второй - одинаковые комбинации .A: слева и справа, в третьей знаки точки слева и справа. Во всех трех примерах наличие членов B: C: игнорируется.

3.15-03 Оператор условия IF: проверка кода ошибки

Программы (утилиты) в момент завершения своей работы обычно оставляют код ошибки (errorlevel), который информирует о том, успешно ли завершилась их миссия или какие обстоятельства этому помешали. Код ошибки представляет собой слово в области текущих данных DOS (смещение 14h в A.01-3), которое принято отображать десятичным числом от 0 до 255 без знака. Обычно код ошибки 0 свидетельствует об успешном завершении, а другие значения соответствуют различным причинам неудач, причем интерпретация значений индивидуальна для каждой программы.

Проверка кода ошибки с помощью оператора условия IF идентифицируется по наличию слова ERRORLEVEL. Она дает возможность определить, не превысил ли код ошибки заданную величину, например:

IF ERRORLEVEL 1 ECHO Execution has failed

IF NOT ERRORLEVEL 1 ECHO Execution has terminated successfully

Условие проверки в первой строке удовлетворяется для всех значений кода ошибки от 1 до 255, то есть для любого из вариантов неудачного завершения. Проверка во второй строке учитывает наличие зарезервированного слова NOT, вызывающего логическую инверсию результата, и потому условие удовлетворяется только для значений меньше единицы. А такое значение только одно нуль. Следовательно, проверка во второй строке выявляет факт успешного завершения.

Иногда требуется выполнить определенную процедуру только в случае возврата одного конкретного значения кода ошибки. Такие задачи решают путем объединения двух проверок в одной строке. Для выполнения перехода только при одном значении кода ошибки, например, 15, нужно написать командную строку

IF NOT ERRORLEVEL 16 IF ERRORLEVEL 15 GOTO ERROR15

В этой строке первое условие удовлетворяется для всех значений кода ошибки от 0 до 15, а второе условие для всех кодов ошибки от 15 до 255. Оба условия вместе удовлетворяются только при одном значении, равном 15, и только тогда будет выполнена команда GOTO ERROR15.

Примечание 1: у некоторых программ ненулевые значения возвращаемого кода ошибки не свидетельствуют о неудаче исполнения.

Примечание 2: все встроенные команды интерпретатора COMMAND.COM (3.01 – 3.34) не возвращают и не изменяют значение кода ошибки.

– 66 –

Глава 3: Команды интерпретатора Command.com

Примечание 3: комбинирование нескольких разнородных проверок в одной строке выполняется так же, как показано выше для проверок кода ошибки.

3.16LFNFOR – установка формы представления имен

Команда LFNFOR (Long File Names FOR = для длинных имен) показывает состояние двоичной локальной переменной, а также позволяет установить ее в единицу (LFNFOR ON) и сбросить в нуль (LFNFOR OFF). По умолчанию эта переменная сброшена в нуль ( OFF ). В MS-DOS7 ее состояние игнорируется, но в "окне DOS" операционных систем Windows-95/98 установление переменной LFNFOR в единицу позволяет правильно воспроизводить длинные имена файлов в циклах FOR, например, таких:

FOR %%Z in (*.*) do echo %%Z

Когда переменная LFNFOR сброшена в нуль, выводимые в цикле FOR длинные имена файлов подвергаются "обрезанию" до 8 знаков, как это всегда происходит в

MS-DOS7.

3.17LH – команда загрузки в область выше 640 кбайт

Команда LH (Load High) служит для загрузки драйверов и резидентных программ за пределы обыкновенной памяти (выше 640 кбайт) на компьютерах с процессором не древнее 80386. Доступ за пределы обыкновенной памяти должен быть обеспечен заранее указанием команды DOS=UMB (4.08) в файле CONFIG.SYS, загрузкой драйвера HIMEM.SYS (5.04-01) и последующей загрузкой драйвера EMM386.EXE (5.04-02) или драйвера UMBPCI.SYS (5.04-04). В обоих

случаях обращение к загруженным резидентным модулям будет происходить через адресное пространство области UMB (640 – 1024 кбайт). Когда в области UMB свободного адресного пространства нет, тогда команда LH не выдает сообщения об ошибке, а просто продолжает размещение загружаемых модулей в обыкновенной памяти, то есть ниже границы 640 кбайт.

Команда LH делает почти то же, что команда INSTALLHIGH (4.16); основная разница состоит в том, что команда INSTALLHIGH, выполняемая загрузчиком IO.SYS, не может принимать участие в оптимизации распределения памяти. Команда LH исполняется командным интерпретатором COMMAND.COM предпочтительно из файла AUTOEXEC.BAT, но может быть исполнена также из командной строки. Вот пример строки файла AUTOEXEC.BAT, в которой драйвер MSCDEX.EXE загружается командой LH:

LH /L:1,23680 \DOS\DRV\Mscdex.exe /D:CD1 /E /S /V /L:O /M:32

– 67 –

Глава 3: Команды интерпретатора Command.com

Имени загружаемого драйвера предшествует путь ( \DOS\DRV\ ), который может быть задан в любой из допустимых форм (2.02-01). Если путь не указан, то поиск драйвера будет производиться в текущем каталоге, а затем по всем путям, записанным в значение переменной %PATH% (2.02-02). Любые слова, указываемые правее имени драйвера, не идентифицируются командой LH, а просто передаются загружаемому драйверу как параметры.

Между именем команды LH и спецификацией загружаемого драйвера может быть введен необязательный параметр /L, позволяющий указать, через какую часть области UMB следует адресовать загружаемый драйвер и насколько большой участок памяти нужно ему выделить (об этом также 4.07). В приведенном выше примере он представлен как /L:1,23680, где /L:1 означает адресацию через первую часть области UMB, а число 23680 – запрашиваемый размер участка памяти в байтах. Нумерацию частей области UMB можно узнать с помощью программы MEM.EXE (6.17) при ее исполнении с параметром /F.

Запрашиваемый размер участка памяти указывать не обязательно, но если он указан, то команда LH принимает еще один параметр /S, например

LH /L:1,2160 /S \DOS\COM\Escape.com

Параметр /S означает, что выделяемый блок UMB следует ограничить согласно указанному размеру. Благодаря тому использование области UMB становится более эффективным, но вместе с тем возрастает риск зависания компьютера, если размер окажется выбран неточно. Не рекомендуется указывать параметр /S и конкретный размер после параметра /L без предварительного проведения процедуры оптимизации распределения памяти, выполняемой программой MEMMAKER.EXE (5.04-03). В результате проведения такой процедуры в строки файла AUTOEXEC.BAT с командой LH будут автоматически вписаны параметры /S и /L с точной спецификацией номера части и размера запрашиваемого участка памяти.

Примечание 1: если доступ за пределы обыкновенной памяти открыт драйвером UMBPCI.SYS (5.04-04), то резидентные модули, загружаемые командой LH, будут размещены в области UMB (640 – 1024 кбайт). Но драйвер EMM386.EXE (5.04-02) действует по-другому: он перенастраивает таблицу преобразования адресов в процессоре так,

чтобы она обеспечивала возможность обращения к участкам расширенной памяти (выше 1088 кбайт) через то же самое адресное пространство области UMB. Поэтому в случае использования драйвера EMM386.EXE команда LH, обращаясь к области UMB, физически будет загружать резидентные модули не в область UMB, а в участки памяти, расположенные выше границы 1088 кбайт.

– 68 –

Глава 3: Команды интерпретатора Command.com

3.18LOCK – запрет конкурентного доступа к диску

MS-DOS7 обслуживает запросы программ на доступ к дискам для обеспечения эффективного управления буферизацией и очередностью доступа. Программам, которым требуется прямой доступ к диску, необходимо координировать свои действия с MS-DOS7 посредством прерывания INT 13\AH=45h (8.01-58). Но встречаются программы, которые этого не делают. К их числу относятся многие полезные программы из прежних версий DOS, например, программа восстановления удаленных файлов Undelete.exe из комплекта MS-DOS6.22. Для обеспечения возможности исполнения таких программ в MS-DOS7 предусмотрена команда LOCK (= запереть), предоставляющая исключительное право на пользование указанным логическим диском той программе, которая будет запущена из следующей командной строки.

Аргументами команды LOCK служат одна или несколько букв дисков, которые надлежит предоставить в исключительное пользование. Перед исполнением команды LOCK запрашивается подтверждение, на которое надо ответить нажатием клавиши Y (да) или N (нет). Чтобы обеспечить безостановочное исполнение команды LOCK в batch-файлах, на запрос нужно заранее заготовить ответ, например, так:

ECHO Y | LOCK C: D:

В результате исполнения такой командной строки запускаемая затем программа получит прямой доступ к логическим дискам C: и D:, не прерываемый запросами от других программ. Когда программа, требовавшая прямого доступа, завершит свою миссию, действие команды LOCK должно быть отменено командой UNLOCK (3.31). Поскольку операции прямого доступа могут быть вложенными, постольку предусмотрена возможность до 256 уровней вложенности команды LOCK. Разумеется, каждая участвующая в таких процессах программа должна быть обеспечена должной последовательностью команд LOCK и UNLOCK.

3.19MD – создание каталога

Команда MD (Make Directory = создать каталог) позволяет создать каталог или подкаталог, например:

MD C:\DOS\ARC

здесь:

C:\DOS\ – пример пути к существующему каталогу, в котором должен быть создан новый подкаталог.

ARC – пример имени для нового подкаталога. Имя не должно оканчиваться обратной косой чертой, но если она уже имеется, ее

– 69 –

Глава 3: Команды интерпретатора Command.com

можно сделать недействительной, добавив в конце точку

(2.02-03).

Имя для нового подкаталога должно быть уникальным, то есть другого такого имени в том же каталоге не должно быть. Если предшествующий имени путь не указан, то новый подкаталог будет создан в текущем каталоге текущего диска.

Примечание 1: MKDIR – еще одно имя той же самой команды MD.

3.20PATH – спецификация путей поиска

Команда PATH (= путь) задает перечень путей, по которым производится поиск вызываемой программы (утилиты) в том случае, если она не находится в текущем каталоге и если путь к ней не указан в командной строке. Задаваемый перечень путей становится значением одноименной переменной окружения PATH. Записать пути в значение переменной окружения можно также с помощью команды SET (3.26), но у команды PATH имеется важное отличие: она автоматически преобразует все строчные буквы в указываемых путях в заглавные. Это необходимо для правильной идентификации имен каталогов в процессе поиска. После имени команды PATH в командной строке должен следовать перечень из путей поиска, указываемых в любой из допустимых форм (2.02-01) и отделяемых друг от друга знаками точки с запятой, например:

PATH C:\DOS\VC4;C:\DOS\MS7;C:\WINDOWS\COMMAND

Спомощью команды PATH можно подвергать преобразованию буквы не только

вспецификациях путей, но также в составе любых других слов.

Примечание 1: в перечне путей с обеих сторон от знаков точки с запятой не должно быть пробелов или других разделительных знаков.

Примечание 2: не допускается наличие знака точки с запятой в конце перечня путей.

Примечание 3: команда PATH без параметров показывает установленное значение переменной PATH.

Примечание 4: команда PATH ; со следующим за ней знаком точки с запятой

удаляет установленное значение переменной PATH.

Примечание 5: в качестве разделительного знака между именем команды PATH и

следующим за ним перечнем путей можно указывать не только пробел, но также знак равенства.

3.21PAUSE – временная остановка исполнения

Команда PAUSE (= пауза) останавливает исполнение batch-файла и выводит на экран сообщение "Press any key to continue..." ("Для продолжения нажмите любую

– 70 –

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]