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

Dos7book

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

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

Такую форму псевдокопирования применяют, когда надо обновить дату файла, а также когда надо удалить файл, если он пуст (примечания 1 и 2).

Использование в команде COPY зарезервированного слова CON (консоль)

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

COPY CON C:\DOS\REMARKS.TXT

Такая команда позволяет набирать текст с клавиатуры в указанный файл до тех пор, пока не будет нажата клавишная комбинация F6-ENTER для возврата обратно в режим командной строки (подробнее в разделе 1.04).

Вместо каталога назначения в команде COPY можно указывать зарезервированные слова PRN (принтер), LPT1 – LPT4 (параллельный порт), COM1 – COM4 (последовательный порт) и NUL (виртуальный порт вывода "в никуда"). В частности, команда

COPY CON PRN

превращает компьютер в пишущую машинку. Конечно, указываемое терминальное устройство должно быть подключено, правильно сконфигурировано и способно адекватно взаимодействовать с DOS. При копировании файлов на внешние устройства по умолчанию принимается копирование с параметром /A, то есть до первой метки конца файла. В отличие от реальных устройств вывода виртуальное устройство NUL всегда сконфигурировано правильно. Копирование в устройство NUL иногда используется для выяснения того, не пуст ли тестируемый файл и можно ли его прочитать.

Примечание 1: пустые файлы (т.е. имеющие нулевую длину) не копируются. Примечание 2: если копируемый файл пуст, и в качестве имени копии указывается

имя существующего пустого файла, то последний уничтожается. Примечание 3: результат копирования нельзя перенаправить, перенаправляются

только выводимые на экран сообщения. Примечание 4: атрибуты копируемого файла не копируются.

Примечание 5: копиям файлов всегда присваивается атрибут "A" (подлежит архивированию).

3.07CTTY – смена канала ввода-вывода

Команда CTTY позволяет изменить принимаемые по умолчанию установки сразу для всех трех основных каналов ввода и вывода: STDIN, STDOUT и STDERR. Начальные установки, действующие с момента включения компьютера, эквивалентны команде CTTY CON и связывают все три упомянутых канала с консолью, то есть с клавиатурой в качестве устройства ввода и с дисплеем в качестве устройства вывода. Вместо консоли (CON) в команде CTTY может быть

– 51 –

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

указан один из портов COM1 (AUX), COM2, COM3, COM4, LPT1 (PRN), LPT2

или виртуальное устройство NUL (для вывода "в никуда").

CTTY – это архаичная команда, расшифровка ее названия Change TeleTYpewriter (= сменить телетайп) напоминает о временах, когда еще не было дисплеев, а ввод-вывод происходил через порты с подключенными печатающими устройствами типа телетайпов.

В наше время есть два повода использовать команду CTTY в batch-файлах. Первый для предотвращения нежелательного прерывания исполнения. Второй - для предотвращения вывода на экран сообщений из канала STDERR, которые нельзя перенаправить иначе. В обоих случаях проблему решает установка с направлением "в никуда", представляемым виртуальным устройством NUL. Команда CTTY NUL должна предшествовать защищаемой группе строк, а после команда CTTY CON должна восстановить нормальное взаимодействие с клавиатурой и дисплеем. В промежутке между CTTY NUL и CTTY CON недопустимы команды, которые могут вызвать неожиданный останов исполнения, потому что сообщение об этом не будет воспроизведено на экране, ввод с клавиатуры не будет воспринят, и компьютер фактически зависнет. Только перезагрузка через CTRL-ALT-DELETE обычно остается возможной.

Действие команды CTTY распространяется на принимаемые по умолчанию установки, но не распространяется на перенаправления, указываемые в строках batch-файла явно. Рассмотрим, например, следующий фрагмент batch-файла:

@ctty nul

copy /B trial.dat suit.dat

echo Press any key to exit > con pause < con

ctty con

Здесь сообщение от команды COPY не будет показано на экране, даже если это будет сообщение об ошибке, а вот сообщение "Press any key to exit" будет воспроизведено, потому что оно явно перенаправлено на консоль (CON), и команда PAUSE тоже сработает правильно, потому что для нее явно указано перенаправление ввода с клавиатуры. Такое использование команды CTTY требует осторожности, но открывает возможности более радикально влиять на отображаемые сообщения. Пример batch-файла с подобным использованием команды CTTY приведен в разделе 9.03-02.

Примечание 1: сообщения, посылаемые через канал STDERR, не могут быть перенаправлены. Когда командой CTTY в качестве установки по умолчанию назначено виртуальное устройство NUL, эти сообщения безвозвратно теряются.

– 52 –

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

3.08DATE – установка даты.

Для установки даты вслед за именем команды DATE (= дата) в командной строке должна быть указана дата, которую надлежит установить, например

DATE 11.07.2002

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

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

ECHO= | DATE | FIND.EXE "Current" >> ANYFILE.TXT

В этой строке первое промежуточное перенаправление ( ECHO= | DATE ) автоматически отвечает на выводимое приглашение, второе промежуточное перенаправление ( DATE | FIND.EXE ) устраняет лишние строки выводимого сообщения, и третье перенаправление ( >> ANYFILE.TXT ) приписывает строку с текущей датой в конец указанного файла. При этом, конечно, должны быть удовлетворены все условия исполнения перенаправлений (2.04-05) и успешного обнаружения упоминаемых файлов (FIND.EXE и того, который надлежит дополнить).

Примечание 1: порядок указания даты, месяца и года неодинаков для разных стран и устанавливается командой COUNTRY (4.05).

Примечание 2: приглашение к вводу новой даты сопровождается подсказкой с обозначением года двухзначным числом. Это ошибка: в MS-DOS7 год обозначается четырехзначным числом.

3.09DEL – удаление файла

Команда DEL (DELete = удалить) не стирает с диска удаляемый файл, а лишь делает недействительной запись о регистрации этого файла в каталоге. Занятые

файлом кластеры становятся свободными и могут быть использованы для записи других файлов; но пока они не перезаписаны, удаленный файл можно восстановить (например, с помощью программы UNDELETE.EXE).

Вот пример командной строки для удаления одного файла командой DEL:

DEL D:\TEMP\FILENAME.EXT /P

здесь:

D:\TEMP\ – пример пути к файлу, который надлежит удалить; если путь не указан, то поиск будет производиться только в текущем каталоге.

– 53 –

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

FILENAME.EXT

пример имени удаляемого файла.

/P

необязательный параметр, вызывающий запрос разрешения на

 

удаление каждого файла.

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

При написании batch-файлов бывает важно обеспечить безостановочное исполнение, не отвлекающее пользователя запросами. В частности, безостановочное удаление файлов по маске *.* обеспечивается, когда команда DEL исполняется в составе цикла FOR (3.13):

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

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

ECHO Y | IF EXIST D:\TEMP\*.* DEL D:\TEMP\*.* > NUL

В этом примере ответ на запрос обеспечивает команда "ECHO Y", а условие "IF EXIST" введено только для того, чтобы избежать сообщения об ошибке "File not found" ("Файл не найден"), когда указанный каталог изначально оказывается пуст.

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

Примечание 2: командой DEL нельзя удалить файлы с атрибутами R (только для чтения), H (скрытый), S (системный), а также каталоги. Удаление каталогов выполняет команда RD (3.23).

Примечание 3: команда DEL . (с точкой) тождественна команде DEL *.*. Примечание 4: команда DEL \ удаляет все не защищенные атрибутами файлы в

корневом каталоге текущего диска.

3.10DIR – вывод содержания каталога

ВMS-DOS команда DIR (DIRectory = каталог) – главный инструмент исследования содержимого каталогов. Вот пример командной строки с командой

DIR:

DIR C:\DOS /P /A:HS /O:GN /S /L /V

здесь:

C:\DOS – пример пути к заданному каталогу. Если путь не указан, то по умолчанию предполагается текущий каталог.

– 54 –

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

/P

необязательный параметр, который при заполнении экрана

 

останавливает вывод строк до тех пор, пока пользователь не

 

разрешит продолжить вывод нажатием любой клавиши.

/A:HS

параметр, разрешающий показывать объекты с указанными

 

атрибутами: H (скрытый), S (системный), A (подлежащий

 

архивированию), R (только для чтения), D (каталоги). Можно

 

использовать префикс "–", чтобы реверсировать отбор: –H (кроме

 

скрытых), –D (кроме каталогов), и т.д.. Если указан только

 

параметр /A (без перечня атрибутов), то будет показано все, что

 

содержится в каталоге. Если параметр /A вовсе опущен, то по

 

умолчанию скрытые и системные файлы не показываются.

/O:GN

параметр, задающий порядок сортировки: G – сначала каталоги,

 

N – по именам, S – по возрастанию размера, E – по суффиксу, D

 

по возрастанию срока давности, A – по возрастанию срока с

 

момента последнего доступа. Можно использовать префикс "–"

 

для реверсирования порядка: –Nпо именам в обратном

 

алфавитном порядке, –Sпо мере уменьшения размера, и т.д..

 

Если параметр /O не указан, то по умолчанию происходит

 

сортировка по именам.

/S

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

 

не только указанного каталога, но и всех вложенных в него

 

подкаталогов.

/L

необязательный параметр, вызывающий выведение имен файлов

 

строчными буквами. Если параметр /L не указан, то имена

 

выводятся так, как они были первоначально набраны.

/V

необязательный параметр, вызывающий выведение

 

дополнительных сведений: атрибутов, времени последнего

 

доступа, занятого дискового пространства, полного дискового

 

пространства и степени его использования. Выведение

 

дополнительных сведений не производится, если заданы другие

 

форматы индикации следующими параметрами:

 

/W

показывать имена в 5 колонок,

 

/B

показывать имена в одну колонку вообще без сводки

 

 

данных о диске; исключение затрат времени на

подготовку этих данных делает команду DIR /B гораздо более быстродействующей.

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

DIR *.txt /P /S /B

– 55 –

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

Сочетание в последнем примере параметра /S с отсутствием спецификации пути фактически означает проведение поиска файлов, удовлетворяющих указанной маске, в текущем каталоге и вдоль всей структуры нижележащих подкаталогов. Если текущим каталогом является корневой каталог диска, то поиск будет производиться по всему диску. Дополнительное указание параметра /B в последнем примере целесообразно тогда, когда надо сделать выводимый список файлов более простым для восприятия.

Параметры команды DIR могут быть записаны в переменную окружения

DIRCMD, (например, командой SET DIRCMD= /P /S /B ), и тогда для

осуществления нужного действия не потребуется набирать эти параметры в командной строке. При необходимости установки, определенные в переменной DIRCMD, можно преодолеть указанием в командной строке тех же параметров с предшествующим знаком дефис "–" (например, /–P ).

Когда команда DIR выполняется с параметром /A, тогда маска *.* (все файлы) включает и каталоги тоже. Если нужно выделить только файлы, то следует указать параметр /A:–D. Эти особенности команды DIR позволяют использовать ее для выяснения, пуст ли данный каталог или нет. В качестве примера рассмотрим следующий фрагмент batch-файла:

@echo off

set DIRCMD=/a /b

dir *.* > C:\Temp\Found.lst

copy C:\Temp\Found.lst NUL | Find.exe "0 file" > nul

if errorlevel 1 echo Current directory is NOT empty if not errorlevel 1 echo Current directory is empty

Вторая строка приведенного фрагмента задает параметры так, что команда DIR не выдаст никаких сообщений, если текущий каталог абсолютно пуст. В третьей строке сообщения команды DIR перенаправлены в файл FOUND.LST. Команда COPY в 4-й строке не станет копировать файл, если он пуст, и выдаст сообщение "0 files copied" ("Скопировано 0 файлов"). Перехватив такое сообщение через перенаправление, программа FIND.EXE (6.14) установит возвращаемый код ошибки (errorlevel) в нуль. Последние две строки просто воспринимают установленный код ошибки, чтобы показать результат теста на экране.

Когда для команды DIR задан обычный формат индикации (без параметров /W или /B ), имена файлов выводятся по-разному в зависимости от того ,в какой операционной среде команда исполняется. В окне DOS операционной системы WINDOWS имена файлов отображаются как обычно, а в MS-DOS7 имена файлов и их суффиксы воспроизводятся отдельно без точки между ними. Эту особенность можно использовать в качестве теста для определения операционной среды.

Примечание 1: команда DIR \ показывает все файлы корневого каталога.

– 56 –

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

Примечание 2: прокрутку строк, выводимых на экран командой DIR, можно временно остановить нажатием клавиш BREAK или CTRL-S.

3.11ECHO – посылка сообщения в канал вывода

Слова, указанные после имени команды ECHO (= отзвук) в той же командной строке, передаются в стандартный канал вывода STDOUT. Если этот канал не перенаправлен, то по умолчанию он связан с консолью ( CON ), то есть с дисплеем в качестве устройства вывода. Примеры вывода текстовых строк с помощью команды ECHO приведены, в частности, в предыдущем разделе 3.10.

Длина выводимого на экран сообщения до 123 знаков ограничивается длиной строки или первым встреченным знаком перенаправления (2.04-022.04-05). Сообщение может содержать служебные коды ASCII, показанные в приложении A.02-8. Но сообщение не должно быть пустым, не должно начинаться со слов ON или OFF, а также с некоторых символов, изменяющих миссию команды ECHO. Перечень таких исключений включает следующее:

Echo ON – устанавливает (включает) ECHO-флаг, разрешающий

 

индикацию следующих командных строк при исполнении

 

batch-файлов; это же состояние устанавливается по умолчанию.

Echo OFF

сбрасывает (выключает) ECHO-флаг, запрещая тем самым

 

индикацию следующих командных строк при исполнении

 

batch-файлов. Вне batch-файлов сброс ECHO-флага вызывает

 

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

Echo

вообще без последующих знаков показывает состояние

 

ECHO-флага в данный момент.

Echo=

с приписанным вплотную знаком равенства посылает в канал

 

STDOUT байты 0Dh 0Ah, действующие эквивалентно нажатию

 

клавиши ENTER (пример в разделе 3.08). В частности, на

 

экране или в файле это вызывает появление пустой строки.

Echo+

тоже посылает в канал STDOUT байты 0Dh 0Ah, но, кроме того,

 

посылает и слова, если они указаны правее знака плюс, в том

 

числе слова ON и OFF. Так же действует команда ECHO с

 

приписанной вплотную точкой или косой чертой.

ECHO-флаг имеет статус локальной двоичной переменной, состояние которой сохраняется до тех пор, пока исполняемые batch-файлы работают в общем пространстве переменных окружения. Но состояние ECHO-флага не наследуется и устанавливается по умолчанию каждый раз, когда командный интерпретатор COMMAND.COM создает производное (дочернее) пространство переменных окружения.

– 57 –

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

Исполняемые командные строки, показываемые на экране при включенном состоянии ECHO-флага, не являются точной копией исходных строк из batch-файлов: в показываемых на экране строках имена вызываемых переменных окружения и формальных параметров уже заменены их значениями. Это бывает очень полезно для поиска возможных ошибок. Но отлаженные batch-файлы обычно исполняются при выключенном состоянии ECHO-флага, и потому почти всегда начинаются с команды @ECHO OFF. Знак @ перед командой ECHO предотвращает воспроизведение самой этой команды на экране.

3.12EXIT – выход из интерпретатора COMMAND.COM

Командный интерпретатор COMMAND.COM (6.04) – это резидентная программа, которая помогает запускать на исполнение другие программы. С другой стороны, командный интерпретатор сам может быть запущен на исполнение как обычная программа, например, для создания отдельного (локального) пространства окружения. В таких ситуациях в памяти компьютера могут оказаться одновременно несколько резидентных модулей командного интерпретатора, причем работающим оказывается тот, который загружен последним. Команда EXIT (= выйти) вызывает

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

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

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

Первичная загрузка резидентного модуля командного интерпретатора происходит при его запуске командой SHELL из файла CONFIG.SYS (пример в 9.01-01). У этого модуля вызвавшей его программы ("предка") нет. Если бы было можно задействовать команду EXIT по отношению к первичному резидентному модулю, то передавать управление было бы некому, и компьютер бы завис. Чтобы предотвратить такой исход, командный интерпретатор COMMAND.COM в первый раз должен быть запущен на исполнение с параметром /P (6.04), который блокирует исполнение команды EXIT.

3.13FOR – оператор цикла

Оператор цикла FOR (= для) организует многократное исполнение других команд. Предположим, например, что нам надо прочитать с экрана три коротких файла: FIRST.TXT, SECOND.TXT и THIRD.TXT. Вместо того, чтобы вызывать эти файлы отдельными командами, можно записать:

– 58 –

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

 

FOR %Z IN (FIRST SECOND THIRD) DO TYPE %Z.TXT

здесь:

 

%Z

пример имени локальной переменной цикла, которая

 

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

 

Это имя не должно начинаться с цифры и обычно сводится к

 

одной букве. При исполнении из командной строки перед этим

 

именем должен быть указан знак процента ( % ), а при

 

исполнении из batch-файла сдвоенный знак процента ( %% ).

IN

– (= в) обязательное зарезервированное слово, предшествующее

 

следующему за ним в скобках перечню значений для локальной

 

переменной цикла.

DO

– (= делай) обязательное зарезервированное слово,

 

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

 

должна быть исполнена в цикле столько раз, сколько значений

 

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

 

раз с подстановкой нового значения вместо указанного в команде

 

имени переменной цикла.

В качестве перечисляемых в скобках значений годятся любые слова, включая подстановки значений переменных окружения (например, %TEMP%) и формальных параметров (2.03-03). Перечисляемые значения можно разделять пробелами, знаками точки с запятой ( ; ) или запятыми ( , ). Заметьте, что пути в значении переменной %PATH% (3.20) отделены друг от друга знаками точки с запятой. Следовательно, такой список путей будет рассматриваться в цикле FOR не как одно целое, а как перечень из нескольких отдельных путей. Последнее обстоятельство позволяет использовать цикл FOR для выяснения того, будет ли заданный файл найден при автоматическом поиске, а также для нахождения конкретного пути к этому файлу. Пример поиска пути к конкретному файлу Fc.exe показан в следующем фрагменте batch-файла:

@echo off set P=

FOR %%Y IN (. %PATH%) DO if exist %%Y\Fc.exe set P=%%Y\Fc.exe if %P%"==" echo Requested file hasn't been found!

if not %P%"==" echo Path to the requested file is %P%

Здесь во второй строке вспомогательной переменной ( P ) присваивается пустое значение, а в третьей строке путь к искомому файлу, если его удается найти. Обратите внимание, что локальной переменной цикла ( %%Y ) в третьей строке предшествуют два знака процента, как должно быть в batch-файлах. Последние две строки проверяют значение вспомогательной переменной ( P ) и по результату проверки выдают соответствующее сообщение.

– 59 –

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

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

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

FOR %%X IN (A:\*.txt A:\*.doc) DO COPY /B %%X C:\DOS

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

ECHO ON

@FOR %%X IN (A:\*.txt A:\*.doc) DO COPY /B %%X C:\DOS @ECHO OFF

Если файл, указанный в скобках цикла FOR, не удается найти, то

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

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

Использование двойных кавычек позволяет записывать в одной строке несколько разных последовательно исполняемых операций, например:

FOR %%Z IN ("set E=%W%" "echo E is set" "goto L23") DO %%Z

Встречаются последовательности операций, которые нельзя выполнить в отдельных строках, но можно выполнить в составе цикла FOR. Примеры решения таких задач имеются в 46-й строке batch-файла, приведенного в разделе 9.03-02, и в 6-й строке batch-файла, приведенного в разделе 9.01-03.

Заключаемые в двойные кавычки группы слов могут содержать подстановки значений переменных (например, %W%), условные команды ( IF ), операторы перехода (goto) и знаки перенаправления (2.04-022.04-05). Если происходит переход из команды, указанной в цикле FOR, то следующие указанные в этом цикле команды не исполняются.

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

– 60 –

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