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

Dos7book

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

Глава 2: Командная строка

2.02-02 Переменная окружения PATH

Для упрощения пользования командной строкой в DOS имеется еще один механизм указания путей поиска через переменную окружения PATH. Чтобы привести этот механизм в действие, нужно выполнить 4 условия:

адресовать команду интерпретатору COMMAND.COM;

заранее записать пути поиска в значение переменной PATH (3.20);

не указывать путь в командной строке;

первым объектом в командной строке указать имя файла, который не находится в текущем каталоге.

Если все эти условия выполнены, то интерпретатор обратится к переменной окружения PATH, прочитает пути поиска в значении этой переменной, и далее

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

PATH показаны в разделах 3.20, 9.01-02, 9.04-02, 9.09-02.

Благодаря переменной окружения PATH запускать программы на исполнение оказывается так же просто, как будто они всегда находятся в любом каталоге. Это очень удобно, но только до тех пор, пока Вам не доведется встретить в текущем каталоге одноименную программу из другой версии DOS. Тогда первой будет найдена именно та программа в текущем каталоге; работать в MS-DOS7 такие программы обычно отказываются. Подходы с разных сторон к проблеме предотвращения подобных конфликтов обсуждаются в разделе 5.01-02 и во вводном разделе к главе 6. Наиболее универсальное решение состоит в вызове конфликтных программ через командные или конфигурационные файлы, содержащие полные спецификации путей. Примеры таких решений приведены в разделе 9.03.

2.02-03 Использование знака точки в спецификациях пути

Знак точки ( . ) в спецификациях пути интерпретируется как указание на текущий каталог. Обратите внимание, например, на завершающую точку, заменяющую путь к каталогу назначения в следующей команде:

Copy /B A:\MyDir\*.* .

Иногда командные файлы (3.02) должны быть написаны так, чтобы они смогли бы выполнить свою миссию в любом каталоге, который заранее неизвестен, и тогда

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

– 31 –

Глава 2: Командная строка

бы принят иной путь, а также когда надо намеренно избежать поиска по путям, указанным в переменной окружения PATH (2.02-02).

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

.\VC4\Vc.exe

Эта форма спецификации пути эквивалентна пути без предшествующей обратной косой черты (см. 2.02-01), но тем не менее может быть полезна при написании batch-файлов с получением спецификаций пути от файл-менеджеров или других программ, потому что более простого способа избавиться от начального знака обратной косой черты MS-DOS не предоставляет. Нередко получаемые спецификации путей заканчиваются знаком обратной косой черты, например:

C:\DOS\MS7\

Для обращения к файлу такие спецификации достаточно лишь дополнить именем файла, но в обращениях к каталогам последней обратной косой черты не должно быть, и тогда самым простым выходом является добавление конечной точки:

C:\DOS\MS7\.

такой путь к каталогу MS7 тоже считается правильным.

Сдвоенная точка, или точка-точка ( .. ) используется в спецификациях путей так же, как одиночная точка, но замещает обозначение не текущего, а вышестоящего (родительского) каталога. Если, например, получив спецификацию C:\DOS\MS7\ , Вы хотите обратиться к вышестоящему каталогу C:\DOS , то достаточно добавить к полученной спецификации два знака точки:

C:\DOS\MS7\..

При разборе спецификаций путей, содержащих знак сдвоенной точки, DOS просто отбрасывает предшествующую стадию пути (в приведенном примере \MS7\ ), не проверяя, является ли указанный там объект каталогом или файлом. Это

дает возможность адресовать новый файл в заранее неизвестном каталоге на основании получаемого во время исполнения полного пути с именем другого файла, находящегося в том же каталоге. Примеры такой адресации показаны в разделе 6.25-03.

Сдвоенная точка без предшествующего пути интерпретируется как указание на вышестоящий каталог относительно текущего, например, в команде смены текущего каталога (3.03):

cd ..

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

– 32 –

Глава 2: Командная строка

cd ..\..

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

2.03Синтаксис командных строк

2.03-01 Разделительные знаки

Слова в командных строках отделяются друг от друга разделительными знаками: пробелом ( ), запятой ( , ), знаком равенства ( = ) или точкой с запятой ( ; ). Хотя пробел используется наиболее широко, любой из перечисленных знаков

игнорируется в начале командной строки и играет роль разделительного знака в операциях разбора строк, включая разбор списка объектов в команде FOR (3.13).

По той же причине перечисленные разделительные знаки не передаются из параметров командной строки во внутренние формальные параметры batch-файлов

(2.03-03).

Имеется, однако, несколько исключений. В командах SET (3.26) и IF (3.15) знак равенства ( = ) играет особую роль и потому не является обычным разделителем. Если запятая, точка с запятой или знак равенства предшествуют команде ECHO (3.11), то имя команды слово ECHO – включается в состав воспроизводимого на экране сообщения. В команде PATH (3.20) в качестве разделителя может быть использована только точка с запятой.

При обработке строк в файлах Config.sys и Msdos.sys (5.01-01) загрузчик IO.SYS воспринимает точку с запятой совсем по-другому: если она стоит первым знаком в строке, то сразу вызывает переход к интерпретации следующей строки. Строки, начинающиеся с точки с запятой, оказываются пропущенными. Этим

можно пользоваться для введения комментариев и для временного предотвращения загрузки отдельных драйверов. Аналогичным образом воспринимает точку с запятой интерпретатор DEBUG.EXE при работе в режиме ассемблирования: он игнорирует саму точку с запятой и всю оставшуюся часть строки после нее,

позволяя тем самым приписывать комментарии к строкам с ассемблерными командами в командных файлах (7.01-05).

– 33 –

Глава 2: Командная строка

2.03-02

Косая черта

Косая черта ( / ) в командных строках MS-DOS показывает, что следующий за ней знак или слово следует интерпретировать как параметр. Например, в команде

DEL C:\TEMP\*.* /P

косая черта ( / ) означает, что следующая за ней буква P – это параметр, в данном контексте вынуждающий команду DEL (3.09) выводить запрос на разрешение удаления каждого файла. Место и форма представления параметров индивидуальны для каждой команды и должны соответствовать ее спецификациям.

Иногда косая черта ( / ) используется в команде FOR как функциональный разделитель, вызывающий преобразование строчных букв в заглавные (подробнее об этом в разделе 3.13).

2.03-03 Знак процента

Знак процента ( % ) означает замещение имени переменной или формального параметра batch-файла значением той же переменной или того же формального параметра. Такое замещение осуществляется до исполнения интерпретатором COMMAND.COM указываемой в строке команды и перенаправлений.

Формальные параметры batch-файлов обозначаются цифрами от 0 до 9. Значением 0-го формального параметра всегда является имя самого batch-файла.

Другим формальным параметрам в качестве значения присваиваются в порядке их расположения отдельные слова (параметры), которые могут быть указаны вслед за именем batch-файла в командной строке, использованной для запуска этого batch-файла на исполнение. Например, обозначение %3 в любой строке batch-файла перед исполнением этой строки будет заменено словом, которое было указано третьим после имени batch-файла в той командной строке, которая запустила этот batch-файл на исполнение. Слитно указанные обозначения (например, %2%3) приводят к конкатенации слов, которыми эти обозначения замещаются. Примеры присвоения значений формальным параметрам показаны в разделах 2.03-04 и 9.03-01.

Если реальное количество слов, следующих за именем batch-файла, было меньше трех, то обозначение %3 просто будет устранено из обрабатываемой строки без сообщения об ошибке. Если количество слов, следующих за именем batch-файла, больше 9, то доступ к остальным возможен посредством сдвига нумерации формальных параметров командой SHIFT (3.27). Среди batch-файлов один является исключением: файл Autoexec.bat (например, 9.01-02), автоматически

– 34 –

Глава 2: Командная строка

запускаемый на исполнение при загрузке компьютера, может не иметь значений формальных параметров, так что вызов

CALL %0

в строке файла Autoexec.bat обычно не приводит к его рекурсивному исполнению

(3.02).

Именами переменных окружения могут служить любые слова, начинающиеся с буквы (но не с цифры!). Значения переменных либо присваиваются с помощью команды SET (3.26) либо наследуются из родительского окружения, т.е. из окружения той программы, которая запустила на исполнение данную программу (6.04). Для осуществления подстановки знаки процента должны стоять с обеих сторон имени переменной (%VAR%, например).

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

Примечание 1: чтобы знак процента не был бы интерпретирован как символ замещения, в строках batch-файла его следует указывать сдвоенным ( %% ). В результате интерпретации сдвоенный знак преобразуется в одиночный, который передается как параметр (т.е. без замещения) указанной в строке команде.

Примечание 2: команда FOR (3.13) использует свою собственную локальную переменную; ее имя, выражаемое одной буквой, вне batch-файлов должно указываться только с одним (предшествующим) знаком процента. Но чтобы передать этот знак процента в команду FOR из строки batch-файла, там имени этой переменной должны предшествовать два знака процента (например, %%Z, 3.13).

Примечание 3: другие интерпретаторы – IO.SYS и DEBUG.EXE – игнорируют знак процента, и подстановку значений переменных и формальных параметров не осуществляют.

2.03-04 Знак двойные кавычки ( " )

Когда интерпретатор встречает двойные кавычки в разбираемой строке, процесс разбора прерывается до того места той же строки, где будет найден еще один (замыкающий) знак двойные кавычки. Любая группа слов и знаков между открывающими и замыкающими двойными кавычками, возможно включающая знаки разделения и перенаправления, будет воспринята как единый элемент, причем и открывающие, и замыкающие двойные кавычки будут считаться принадлежащими этому элементу. Например, при исполнении строки

C:\>Batch.bat 1 " 2 3 " 4 ""

– 35 –

Глава 2: Командная строка

будет создан новый набор формальных параметров, в котором значением формального параметра %1 будет цифра 1, значением формального параметра %2 будет группа " 2 3 ", значением формального параметра %3 будет цифра 4, значением формального параметра %4 будет пустая пара двойных кавычек " ".

Перечисленные значения формальных параметров будут сохраняться неизменными до завершения исполнения файла Batch.bat. Заключение группы слов в двойные

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

Пустая пара двойных кавычек ( " " ) рассматривается как специальный пустой символ, позволяющий не передавать никакого определенного значения и в то же время сохранить порядок присвоения значений формальным параметрам. Большая часть встроенных команд (кроме ECHO, IF и SET) игнорирует пустую пару двойных кавычек, но принимает то изменение порядка параметров, которое происходит в результате их введения. Например, следующая команда (3.03)

перехода в другой каталог

C:\>cd ""

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

C:\>cd "C:\dos"

Наличие замыкающей двойной кавычки при разборе строк обычно не проверяется, за исключением команд FIND и FOR. Разбор строк этих команд отличается тем, что сами двойные кавычки не считаются входящими в ту группу слов, которая в них заключена. Благодаря этому пустую пару двойных кавычек ( " " ) можно использовать в команде FIND (6.14) для подсчета полного числа строк в файлах. По той же причине команда FOR (3.13) позволяет избавиться от обрамляющих двойных кавычек, когда в них больше нет необходимости.

2.03-05 Квадратные скобки

Квадратным скобкам [ ] приписывается особое значение в файлах, которые должны быть интерпретированы отладчиком DEBUG.EXE или загрузчиком IO.SYS. Отладчик DEBUG.EXE интерпретирует данные в квадратных скобках как адреса тех ячеек памяти, где записаны операнды (подробнее во вводной статье к главе 7).

В конфигурационных файлах MSDOS.SYS и CONFIG.SYS, которые должны быть интерпретированы загрузчиком IO.SYS, квадратные скобки имеют совсем

– 36 –

Глава 2: Командная строка

другое значение: заключенные в них слова отмечают начало отдельных

конфигурационных блоков и в то же время являются именами этих конфигурационных блоков. Пример написания файла MSDOS.SYS приведен в разделе 5.01-01.

Для обозначения особых блоков в файле CONFIG.SYS существуют два зарезервированных слова: [menu] и [common]. Первое имя ([menu]) можно присваивать только блоку меню выбора вариантов конфигурации; если такой блок имеется, то он должен быть первым в файле CONFIG.SYS. Блок [menu] выделяется также особым составом команд: команды MENUCOLOR (4.19), MENUDEFAULT (4.20), MENUITEM (4.21) и SUBMENU (4.29) можно использовать только в блоках,

объявленных как меню или субменю. Все другие конфигурационные команды, описанные в главе 4 (кроме NUMLOCK, 4.23), в блоке [menu] применять нельзя.

Команды, которые должны быть исполнены во всех конфигурациях, группируются в один или несколько блоков, названных одинаковым именем [common]. Вне заголовков имена конфигурационных блоков используются без

ограничивающих квадратных скобок в качестве ссылок на соответствующие блоки (4.14). Примеры вариантов написания файла CONFIG.SYS с блоками [menu], [common] и рядом других приведены в разделах 9.04-01 и 9.09-01.

2.04Знаки в роли команд

2.04-01 Двоеточие

Интерпретация двоеточия ( : ) зависит от его места в командной строке. Когда оно стоит первым в строке batch-файла, то следующее за ним слово считается меткой, обозначающей адресную точку для перехода. Если в той же строке имеются еще другие слова, то они не будут приняты во внимание. Сдвоенное двоеточие ( :: ) в начале строки batch-файла иногда ставится для того, чтобы предотвратить исполнение всех указанных в строке операций, включая операции перенаправления

(2.04-02 – 2.04-05).

Когда двоеточие ( : ) стоит в командной строке на втором месте, и ему предшествует буква, а остальная часть строки либо пуста, либо представляет собой одну обратную косую черту, либо заключена с обеих сторон знаками обратной косой черты, то в таких комбинациях начальная буква интерпретируется как буква диска, а вся комбинация воспринимается как команда перехода на этот диск, т.е. замены принимаемого по умолчанию (текущего) диска на указанный в этой команде. Например, чтобы перейти на диск A:, нужно набрать команду:

– 37 –

Глава 2: Командная строка

A:

или

A:\

или

A:\WINDOWS\

и потом нажать клавишу ENTER. Смена текущего диска не изменяет каталога, который считался принимаемым по умолчанию (текущим) на этом диске. Если, в частности, до перехода на диске A: принятым по умолчанию каталогом был A:\DOS, то он и останется в этой роли после исполнения любой из показанных выше команд перехода. В подобных командах любой путь, который может быть заключен между знаками обратной косой черты, не принимается во внимание и не проверяется. Фактически в качестве команды смены диска годится любой полный адрес, если справа к нему приписать знак обратной косой черты.

2.04-02 Левая стрелка

Левая стрелка ( < ) – это команда установить перенаправление ввода данных, исполняемая командным интерпретатором COMMAND.COM в ходе подготовки к передаче управления той программе, имя которой указано слева от левой стрелки в той же строке. По умолчанию стандартный канал ввода данных ( STDIN ) связан с консолью ( CON ), т.е. принимает ввод с клавиатуры. Фактически левая стрелка

воспринимается как команда соединить стандартный канал ввода данных ( STDIN ) с тем источником, который указан справа от знака перенаправления ввода. Когда программа, указываемая слева от знака левой стрелки, запросит ввод данных через канал STDIN, она получит данные именно из этого источника. Естественно, воспользоваться перенаправлением ввода могут только те программы, которые запрашивают ввод через канал STDIN. Например, строка

MORE < C:\DOS\Filename.txt

означает, что программа MORE.COM (6.19) получит через канал STDIN данные, считываемые из указанного файла в каталоге C:\DOS\. Если путь к файлу не указан, то поиск его будет производиться только в текущем каталоге. Поиск по путям, указанным в переменной PATH, при перенаправлениях не производится, использование маски файла вместо имени не допускается, знаки подстановки (2.01-03) не раскрываются.

Помимо файлов, в качестве источника данных можно указывать порт (LPT1, LPT2, COM1, COM2, COM3, COM4). Когда устанавливаемые по умолчанию связи прерваны командой CTTY NUL, тогда для осуществления ввода с клавиатуры требуется явное перенаправление ввода с указанием консоли ( CON ) в качестве источника (пример в разделе 3.07).

– 38 –

Глава 2: Командная строка

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

Примечание 1: перенаправления осуществляют путем подмены данных в таблице JFT (примечание 3 к A.07-1). Перенаправления, установленные

командным интерпретатором для конкретной исполняемой программы, могут быть изменены или отменены самой исполняемой программой (пример в разделе 9.07-02).

Примечание 2: интерпретаторы DEBUG.EXE и IO.SYS не выполняют перенаправлений и игнорируют все знаки перенаправления (2.04-02

2.04-05), в том числе левую стрелку. Тем не менее DEBUG.EXE способен воспринимать команды через перенаправление ввода, которое установит для него интерпретатор COMMAND.COM (примеры в разделе 9.02).

2.04-03 Правая стрелка

Правая стрелка ( > ) – это команда установить перенаправление вывода данных, исполняемая командным интерпретатором COMMAND.COM в ходе подготовки к передаче управления той программе, имя которой указано слева от правой стрелки в той же строке. По умолчанию стандартный канал вывода данных ( STDOUT ) связан с консолью ( CON ), т.е. осуществляет вывод на экран дисплея. Перенаправление вывода позволяет связать канал STDOUT с другой целью назначения той, которая указана справа от правой стрелки в командной строке. Например, команда DEL /? (3.09) выводит на экран справочные данные, но когда вслед за ней стоит правая стрелка, эти справочные данные будут выведены не на экран, а в указанный файл:

DEL /? > Filename.txt

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

Помимо файлов, допустимыми целями перенаправления вывода являются порты LPT1, LPT2, COM1, COM2, COM3, COM4, принтер PRN, который фактически эквивалентен порту LPT1, а также виртуальное устройство NUL, которое действует как "черная дыра": любые сообщения теряются там навсегда (примеры в разделе 3.21). Перенаправление вывода в устройство NUL часто

– 39 –

Глава 2: Командная строка

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

Когда устанавливаемая по умолчанию связь канала STDOUT прервана командой CTTY NUL (3.07), тогда для осуществления вывода сообщений на экран необходимо явное перенаправление вывода с указанием консоли ( CON ) в качестве цели назначения (примеры в разделе 9.03-02).

С помощью знака правой стрелки нельзя перенаправить те данные, которые посланы не по стандартному каналу вывода STDOUT, а по каким-либо другим каналам. В частности, сообщения, посылаемые через прерывание INT 29 (8.02-88), через прерывания BIOS (8.01-17, 8.01-21, 8.01-33) и через канал вывода сообщений об ошибках ( STDERR, номерная ссылка 0002h ), не перехватываются средствами перенаправления вывода.

Если перенаправления ввода и вывода приходится комбинировать в одной строке, то вслед за основной исполняемой командой надо сначала указать левую стрелку перенаправления ввода с последующей спецификацией источника, и лишь затем правую стрелку перенаправления вывода и новую цель назначения. Примеры комбинированных перенаправлений показаны в разделах 6.14, 6.25-03 и 9.03-02.

Всем знакам перенаправления (2.04-022.04-05) приписывается более высокий приоритет по сравнению с обычными операциями, за исключением знаков меток (2.04-01) и двойных кавычек (2.03-04). В частности, в командах ввода строк (ECHO, SET) все знаки перенаправления не включаются в состав вводимых строк, а инициируют исполнение перенаправления. По той же причине на исполнение перенаправлений не оказывают влияния условия, определяемые командой IF (3.15). Единственная возможность условного исполнения перенаправления состоит в том,

чтобы обойти строку с перенаправлением посредством команды условного перехода "IF ... GOTO..." (3.15, 3.14).

Перенаправление осуществляется даже тогда, когда основная исполняемая команда никаких сообщений не выдает, или вовсе не исполняется из-за ошибок. Например, команда REM не выдает никаких сообщений, но тем не менее перенаправление ее пустого вывода весьма распространенный способ создания новых файлов нулевой длины (3.24).

Чтобы перенаправить сообщения сразу от всех команд, указанных в строках batch-файла, нужно для исполнения этого файла запустить отдельный резидентный модуль командного интерпретатора COMMAND.COM с параметром /С (примеры в 3.22 и 9.01-03). Без запуска отдельного резидентного модуля командного интерпретатора сообщения, выводимые при исполнении строк batch-файлов, можно перенаправлять только индивидуально, от каждой строки в отдельности.

Перенаправлением вывода следует пользоваться осторожно, потому что вместе

сожидаемыми сообщениями могут быть перенаправлены и не выведены на экран

40 –

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