Команды MS-DOS подразделяются на внутренние (встроенные в саму Операционную
систему) и внешние выполненные в виде отдельных файлов (имя которых и является
командой).
К командам помощи в MS-DOS относятся <команда> /?, fasthelp,
help.
<команда> /? - Выдает справку по
команде. <имя_диска>: - Cмена текущего диска. Диски a: и b: -
это дискеты, все остальные логические диски жесткого
диска(ов) <имя_программы> - запуск программы с заданным
именем. <источник> > (>> < или :) <назначение>
- пересылка вывода сообщения (если стоит > то вывод идет с замещением файла,
если >> вывод идет с дописью в конец файла, < происходит считывание из
файла, :. ATTRIB <+/-атрибут(ы)> <ключи> <имя
файла(ов)> - устанавливает(+) или снимает(-) заданный(ые) атрибут(ы) .
Атрибуты:
- R - файл только для чтения (read only).
- A - Архивный файл (archive).
- H - Скрытый файл (hidden).
- S - Системный файл(system).
BACKUP -программа-оболочка для
создания резервных копий. CALIBRATE <дисковод:>
<параметры> -проверка надежности жесткого диска. CD - Cмена
текущей директории. (cd\ - зайти в корневую директорию. cd kat - зайти в
директорию KAT текущей директории. cd .. - поднятся на один уровень вверх по
файловой структуре.) CHECKDISK - проверяет жесткий диск на наличие
ошибок. CLS - очищает экран монитора. COPY <ключи>
<источник> <ключи> <назначение> - копирует файл(файлы) из
источника в назначение.
- в качестве источника и назначения могут служить логические имена
физических устройств (CON -консоль(при вводе клавиатура при выводе монитор),
LPT -параллельный порт, COM и AUX -последовательный порт, PRN -принтер)
- ключ /a - файл расматривается как последовательность символов.
- ключ /b - файл расматривается как последовательность бит.
- ключ /v - копирование происходит с проверкой.
- команда COPY может служить и для обьединения файлов (COPY имя_файла_1
имя_файла_n имя_общего_файла)
DATE <нужная дата> -
настраивает системный календарь DEFRAG <имя диска>
<параметры> -устраняет фрагментацию диска. Параметры: /f-полная
оптимизация диска. /u-только дефрагментация. DEL <имя файла> -
удаление указанного файла. DELTREE <имя директории> - удаление
директории со всем содержимым. DIR - Просмотр списка поддиректорий и
файлов в текущей. (dir <путь> <ключи>)
- ключ /p - постраничный вывод информации.
- ключ /w - вывод на всю ширину экрана.
- ключ /a: - вывод файлов по заданным атрибутам.
- r - файлы только для чтения.
- h - скрытые файлы.
- s - системные файлы.
- a - архивные файлы.
- d - директории.
- ключ /o: - отсортированный вывод файлов.
- n - по имени
- e - по расширению
- s - по размеру
- d - по дате и времени создания
- g - сначала идет вывод директорий
- a - по последней дате открытия
- ключ /s - вывод идет включая поддиректории.
- ключ /b - вывод только имен файлов.
- ключ /l - использование нижнего регистра.
- ключ /v - отображение расширенных сведений о файлах и папках.
- ключ /4 - вывод четырех цифр года (если не указан ключ /V).
DISKCOPY <имя первого диска> <имя второго диска>
<параметры> - копирует содержимое одного диска на другой (используется
в отсновном для копирования дискет). DN - запуск оболочки MS-DOS - DOS
Navigator DOSKEY <ключи>
<имя_макрокоманды=определение_макрокоманды> - запуск программы
обработки макрокоманд. DS <режимы> <имя каталога>
<ключи> - сортировка файлов в каталоге. EDIT - Вызов
текстового редактора. ERASE <имя файла> - тоже самое что и
DEL FA <имя_файла> <параметры> - отображает или изменяет
атрибуты файлов. FASTHELP <имя команды> - без имени команды
выдает список команд DOS, с именем дает справку по команде. FC
<параметры> <имя первого файла(ов) или директории(ий)> <имя
второго файла(ов) или директории(ий)> - сравнение файлов или
директорий. FD <имя_файла> <параметры> - изменяет дату и
время модификации файлов. FDISK <параметры> - разбивает жесткий
диск на отдельные логические диски. FILEFIND <имя_файла>
<строка_символов> <ключи> - поиск файла по заданному
имени. FORMAT <диск:> <параметры> -форматирование
дисков. -запуск программы оболочки которая выдает информацию о
дисках. GRAPHICS - позволяет выводить на печать по клавише Print
Screen не только текст, но и графику. HELP <тема-справочника> -
вызов интерактивного справочника. IMAGE <диск:> -создание копий
системных областей жесткого диска. LABEL <диск:> <метка>
-задает метку диска. LP <имя_файла> <место_печати>
<режимы> -печать файлов с форматированием. MD <имя
директории> - создает указанную директорию или
подиректорию. MEM - выдает что делается в памяти компьютера (mem /c /p
- выдает более подробную справку, отражающую расположение программ в памяти с
постраничным выводом на экран). MEMMAKER - запуск диспечера
(менаджера) памяти. MOVE <источник> <назначение>
<ключи> - перемещает файл(файлы) из источника в
назначение. NC - запуск оболочки MS-DOS - Norton Commander. NCD
<начало_имени_каталога> <режимы> - переход по файловой структуре
посредством ее представления в виде дерева каталогов. NDD
<дисковод:> <параметры> -запуск нортон диск
доктора. PROMPT <текст> -задает приглашение
MS-DOS. RAMDRIVE - создает в оперативной памяти виртуальный
диск. REM <старое имя> <новое имя> - переименование
файла(файлов) или директории(директорий). RD <имя директории> -
удаление пустой директории. SCANDISK - как и checkdisk проверяет
жесткий диск на наличие ошибок, но является более
продвинутой. SMARTDRV - ускоряет работу жесткого диска и CD-ROM (по
своей сути является программным кэшем). SPEEDDISK <дисковод:>
<режимы> -оптимизация размещения файлов на диске. SYS <имя
первого диска> <имя второго диска> - создание загрузочной дискеты
(загрузочной области на жестком диске). SYSINFO - Выдает информацию о
системе (компьютера) TIME <час минуты секунды> - настраивает
системное время. TYPE <имя файла> - Просмотр файла в текстовом
виде. UNDELETE <имя файла(ов) или директории(ий)> <ключи>
- позволяет востановить удаленные файлы. UNERASE <имя файла(ов) или
директории(ий)> <ключи> - тоже что и UNDELETE. UNFORMAT
<диск:> <параметры> -востановление отформатированного
диска. VC - запуск оболочки MS-DOS - Volkov Commander. VER -
Позволяет узнать какая версия DOS установленна у вас на компьютере. Если у
вас стоит Windows, то команда ver выдаст "Windows <номер
версии>" VERIFY (on/off) - включает проверку записи файлов при
копировании или перемещении. VOL <диск:> -выдает метку
указанного диска. WIPEINFO <имя_файла> <ключи> -удаление
ненужных файлов с затиранием того места где они были. XCOPY
<источник> <назначение> <ключи> - копирует директории,
параметры такие же как и у COPY.
Как сделать командные файлы Ms-dos более "дружелюбными" |
Автор:Hardin Brothers
Иногда многократное повторение уже известного приводит к
открытию. Недавно я получил несколько писем от пользователей DOS, которых
интересует одна проблема: как создать более "дружелюбные" командные файлы,
запрашивающие у пользователей значения параметров?
Кеннет Харт (Kennet Hart) из Аустина (шт.Техас) ставит вопрос конкретно:"Известно,
что можно
задать значение переменных
для командного файла (в
данном случае от
%1 до %3) как BATCHFILE VARIABLE1 VARIABLE2 VARIABLE3 Я хотел бы узнать: возможен ли ввод переменных в
процессе работы командного файла или вызов с этой целью другого командного файла
или программы? Большинство программ считывания нажатий клавиш и утилита CHOICE в
DOS 6.0 могут обрабатывать нажатие только одной клавиши. Мне необходимо
производить ввод переменных, содержащих более одного символа, включая нажатие
клавиши ENTER."
Моим первым ответом на
этот весьма распространенный вопрос было: "Нет, это невозможно". Язык для
создания командных файлов не предусматривает интерактивной
работы.
После того, как все
разработчики программной продукции под DOS включили в свои продукты одну из
разновидностей утилиты KEYGET, компания Microsoft, идя навстречу
пользовательскому спросу, также включила в DOS 6.0 утилиту CHOICE.COM. Все
программы такого типа считывают клавишу, нажатую пользователем, и передают ее
значение командному файлу на уровне обработки ошибок. Однако единичное нажатие
еще не является целой переменной. Например, если для работы командного файла
требуется ввести имя поддиректории, то простое меню с выбором А и B не
поможет.
Одно из возможных решений
состоит в использовании альтернативного языка командных файлов, который содержал
более широкий набор команд по сравнению с имеющимися в MS-DOS. Но возможно ли
производить интерактивный ввод с клавиатуры без использования специальных
утилит? Да, если при создании командного файла применить технику переопределения
ввода/вывода, рекурсии и манипуляции файлами, а также обзавестись 39-байтным
фильтром.
Формат команды
DOS.
Если вы никогда не писали
командных файлов, использующих переменные в командной строке, то многое
потеряли. Именно ввод переменных из командной строки (или параметров, как их
иногда называют) делает командные файлы мощными и гибкими. К примеру, при
написании командного файла для копирования данных в конце рабочего дня вы можете
использовать в командной строке переменные для ввода имени директории, в которой
хранятся данные, и обозначение диска, на который эти данные надо
скопировать.
Когда вводится команда
в строке приглашения C:\>, командный интерпретатор подразделяет ее на две
части. Первое слово (все символы до первого пробела или символа табуляции)
являются непосредственно командой. Им может быть имя внутренней функции DOS
(DIR), исполняемой программы, например QBasic, или командного файла. Оставшаяся
часть воспринимается интерпретатором как параметры командной строки. Обычно там
ничего нет, так как пользователи чаще всего набирают команду без
параметров.
При запуске командного
файла интерпретатор делит строку параметров на слова, отделенные друг от друга
пробелами или знаками табуляции. Каждое слово записывается в переменную с
определенным номером. Командный файл присваивает первому слову имя %1, второму -
%2 и т.д. Специальная переменная %0 содержит первое слово из командной строки -
имя самого командного файла.
Например, следующий командный файл выводит на экран
содержимое переменных от %0 до %3:
@ECHO OFF
ECHO Мое имя %0
ECHO переменная 1 %1
ECHO переменная 2 %2
ECHO переменных 3
%3
Запишите эту
программу под именем TEST1.BAT, а затем запустите ее, набрав TEST1 ABEL BAKER
CHARLIE. На экране появится Мое имя TEST1
переменная 1 ABEL переменная 2 BAKER переменных 3 CHARLIE
Существует множество способов использования параметров
командной строки. Как правило, они содержат имена файлов или директорий,
переключатели программных опций и даже пароли. Немного поэкспериментировав
(можно начать с изменения приведенной выше демонстрационной программы), можно
быстро освоить несложную технику работы с этими
параметрами.
Переадресование
ввода/вывода.
Все внутренние утилиты
DOS и наиболее простые программы используют стандартные процедуры ввода/вывода.
Это значит, что применяется самый простой метод для считывания пользовательских
данных с клавиатуры и вывода их на экран. Но это и означает, что направление
ввода/вывода может быть переопределено. (Для ускорения работы приложения обычно
используют не стандартные, а более мощные и быстрые методы, что исключает
возможность переопределения.)
После
переопределения направления ввода команда или программа перестает считывать
клавиши, нажатые пользователем. Вместо этого данные считываются с другого
устройства, например с модема или из файла. Переадресование вывода значит, что
данные будут идти не на экран, а в файл, на принтер и т.д. При этом программа
даже не знает, что направление ввода/вывода изменено. Обслуживание изменений
берет на себя DOS, а программа работает так, как будто ничего не произошло -
данные вводятся с клавиатуры и печатаются на экране.
Для того, чтобы произвести переопределение направления
ввода, необходимо использовать в командной строке знаки "больше" (>) или
"меньше" (<). Например, команда XWRITE < MYFILE.ASC запускает некую
программу XWrite и сообщает DOS, что ввод данных должен быть произведен не с
клавиатуры, а из файла MYFILE.ASC.
Однако чаще всего используется знак "больше". Команда
XWRITE > MYFILE.ASC запускает XWrite и обеспечивает вывод данных в файл
MYFILE.ASC. К примеру, с использованием переопределения вывода можно вывести
листинг директории на принтер командой DIR > PRN. Иногда приходится использовать двойной знак "больше".
Символы > и >> действуют одинаково, за исключением ситуации, когда
файл, в который переопределяется вывод, уже существует. Знак > приведет к
удалению старого файла и созданию нового; знак >> сообщает DOS, что новые
данные должны быть добавлены к старым.
Для записи данных в файл командные файлы могут
использовать команду ECHO. Для примера рассмотрим следующую
строку:
ECHO Это тест >
MYFILE.ASC
Она создает файл под
названием MYFILE.ASC и записывает в него сообщение "Это тест". Таким способом вы
можете писать данные в файл вручную.
Программа, ввод/вывод которой должен быть переадресован,
называется фильтром. Утилита MORE, включенная в DOS, получает данные из файла
или от другой команды. Затем она выводит их на экран и ждет нажатия клавиши,
чтобы распечатать следующий экран с данными. Эту программу можно запускать саму
по себе, однако никакого смысла в этом нет. Две другие утилиты SORT и FIND также
не делают ничего особенного, до тех пор, пока их ввод/вывод не
переадресован.
Командный файл
запускает сам себя.
На первый взгляд
идея рекурсивного файла может показаться сложной и запутанной. Рекурсия - еще
одно компьютерное понятие, которое так же, как переменная и переадресование,
выглядит сложнее, чем есть на самом деле. Любая программа или часть программы,
которая прямо или косвенно перезапускает сама себя, называется
рекурсивной.
Чтобы наблюдать
бесконечную рекурсию в действии, создайте новый командный файл TEST2.BAT,
содержащий следующее:
@ECHO Я
рекурсивный
@TEST2
После запуска программа напечатает на экране сообщение и
затем вызовет себя опять. И так до бесконечности. Чтобы остановить этот процесс
надо нажать Ctrl-C или Ctrl-Break. Судя по
примеру, можно подумать, что рекурсивные файлы практически бесполезны. Однако
это не так. Рекурсивные файлы могут выполнять очень серьезные задачи, что и
будет продемонстрировано ниже.
Решение проблемы.
Давайте вернемся к TEST1.BAT - простой программе,
распечатывающей содержимое трех переменных. Предположим, вы хотите перед выводом
переменных на экран убедиться, что их действительно три. Если программа получает
больше, чем три переменных, то останавливается и печатает сообщение об ошибке.
Если же переменных меньше трех, то у пользователя запрашиваются недостающие
переменные.
Все сказанное относится к
демонстрационной программе. Реальный командный файл может запрашивать имена
директорий, файлов, дней недели и дисководов. Тем не менее на примере легче
понять логику действий, не усложненную разными тонкостями, связанными с поиском
и копированием файлов.
Вот
логическая структура этой программы:
- если Переменной 1 нет, запросить ее у пользователя и
переслать командному файлу;
- если
Переменной 2 нет, запросить ее у пользователя и переслать командному файлу
вместе с Переменной 1;
- если Переменной
3 нет, запросить ее у пользователя и переслать командному файлу вместе с
предыдущими двумя;
- если присутствует
Переменная 4, объяснить пользователю, что он ввел слишком много
переменных;
- вывести на экран
переменные 1, 2, 3.
Приведенная
логическая последовательность решает лишь часть изначально поставленной задачи -
организации корректного ввода данных пользователем. Но ведь надо еще эти данные
передать командному файлу. Один из методов состоит в повторном вызове командного
файла с дописыванием пользовательских данных в конец строки
параметров.
Для лучшего понимания
представим себе этот метод следующим образом : когда пользователь набирает в
командной строке лишь одну переменную TEST ALPHA, программа запрашивает вторую и
перезапускается командной строкой TEST ALPHA USERINPUT. Таким образом командный
файл получает пользовательские данные в пригодном для обработки виде. Основная
часть командного файла при этом выглядит так :
(имя файла TEST.BAT)
IF NOT "%1"=="" GOTO OKAY
COLLECTINPUT
TEST USERINPUT
:OKAY
другие команды
Однако для обработки данных пользователя необходимо
вначале каким-то образом их собрать. DOS предоставляет для этого по крайней мере
один способ. Команда COPY CON <имя файла> позволяет записать необходимое
количество информации в файл. При нажатии Ctrl-Z (или F6) и затем ENTER, DOS закрывает файл и переходит обратно в обычный режим.Это
и есть вторая часть решения. Для ввода пользовательской информации используйте
следующие команды :
ECHO Введите
параметр
ECHO Затем нажмите Ctrl-Z и
ENTER
COPY CON TEMP1 >
NUL
Первые две строки содержат
инструкции для пользователя. Третья строка копирует всю введенную пользователем
информацию во временный файл. Последняя часть > NUL посылает сообщение,
выдаваемое командой COPY в устройство NUL, т.е. надпись "1 file(s) copied" не
выводится на экран. Устройство NUL - своеобразная "черная дыра". Информация,
которая посылается туда, исчезает бесследно. COPY "думает", что выдает на экран
интересные для пользования сведения, а вместо этого они отправляются в NUL (что
нам и нужно).
Завершающий этап.
Итак, введенные пользователем данные хранятся во
временном файле. Каким образом TEST может снова вызвать себя, присоединив эти
данные к строке параметров? Каким образом провести рекурсию правильной командной
строки? Ответ заключается в использовании
косвенной рекурсии, а именно TEST.BAT должен запустить другой командный файл,
который в свою очередь запустит TEST.BAT. Второй командный файл создается в
интерактивном режиме. Начнем с заполнения
имени текущего командного файла и текущей строки параметров в новом файле.
Используем для этого, как обычно переопределение :
ECHO %0 %1 %2 %3 > TEMP2 > NUL
COPY TEMP2+TEMP1 TEMP.BAT
Эти строки создают командный файл TEMP.BAT, содержащий
все необходимые составляющие. Имя текущего командного файла использовано в
качестве команды на запуск вместе с текущей строкой параметров и данными,
дополнительно введенные пользователем (файл TEMP1). Теперь можно запустить его,
набрав TEMP. В свою очередь TEMP.BAT перезапустит текущий командный
файл.
Казалось бы, все должно
заработать, но на самом деле есть еще одна небольшая проблема. Строка ECHO %0 %1
%2 %3 > TEMP2 в конце содержит код клавиши ENTER. Дополнительная
пользовательская информация попадает во вторую строку, в то время как нам нужно
присоединить ее в конец первой.
Код,
вырабатываемый по нажатию клавиши ENTER, является совокупностью кодов возврата
каретки (ASCII 13) и перевода строки (ASCII 10), следующих один за одним. Если
бы удалось вместо этих символов вставить пробелы, задача была бы решена, так как
все данные оказались бы на одной строке.
Простейший способ произвести такие изменения в файле
состоит в создании фильтра. Вы посылаете файл на вход фильтра и переопределяете
выход фильтра на новый файл. В новом файле будут содержаться все необходимые
изменения, произведенные фильтром. Лучшее средство построения простых фильтров -
утилита DEBUG, поставляемая со всеми версиями MS-DOS и большинством версий PC
DOS.
| NOCTRL.SCR - это ассемблерный листинг, позволяющий создавать программу
NOCTRL.COM, удаляющуюсимволы возврата каретки и
перевода строки посредством замены их на коды пробелов
| A 100
| MOV
AH,3F
| SUB BX,BX
| MOV CX,1
| MOV
DX,80
| INT 21
| JC 0125
| CMP
AX,1
| JL 0125
| MOV SI,80
|
MOV DL,[SI]
| CMP DL,20
| JNB 011F
| MOV
DL,20
| MOV AH,2
| INT 21
| JMP
0100 | INT 20
| N
NOCTRL.COM
| RCX
| 27
|
W
| Q
DEBUG создаст файл NOCTRL.COM директории.
Последняя преграда преодолена. строки, описанные выше, новыми:
Фильтр, который я написал, делает несколько больше, чем
простое уничтожение символов возврата каретки и перевода строки. Программа
NOCTRL.COM (см. листинг) заменяет все управляющие коды (символы с
ASCII-значением меньше 32) на пробелы. Она читает символы по одному стандартным
образом и проверяет каждый из них. Вместо управляющего символа на стандартный
выход посылаются пробелы. Если же символ обычный, то он посылается без
изменений. Работа фильтра заканчивается по окончании ввода данных. Для создания NOCTRL.COM наберите его листинг в любом
текстовом редакторе (включая пустую строку) и сохраните под именем NOCTRL.SCR.
Для дальнейшего необходимо, чтобы DEBUG находился в той же директории, или путь
к нему был указан директивой PATH. Затем наберите команду DEBUG < NOCTRL.SCR
ECHO %0 %1 %2 %3 > TEMP2
COPY TEMP2+TEMP1 TEMP3 > NUL
NOCTRL < TEMP3 > TEMP.BAT
TEMP.BAT
Листинг программы KEYSGET.BAT демонстрирует законченный
командный файл. Имена некоторых промежуточных файлов для удобства изменены. Я
использовал расширения .$$$ для временных файлов, чтобы облегчить их поиск и
уничтожение.
Попоробуйте запустить
KEYSGET.BAT с одним, двумя или тремя параметрами. Попробуйте с четырьмя. Зная,
как это все работает, вы можете применить эту технику совместно с NOCTRL.COM в
своих собственных командных файлах. Больше никогда ваши командные файлы не будут
давать сбой из-за того, что вы забыли указать необходимую информацию в командной
строке. Вместо этого они просто будут запрашивать дополнительные
данные.
| KEYSGET.BAT демонстрирует, как с помощью
NOCTRL.COM можно обрабатывать
несколько символов в командной строке во
время работы командного файла.
| @ECHO OFF
|
REM ВНИМАНИЕ!
| REM
| REM
Создает и уничтожает несколько файлов с расширением .$$$ и REM один файл
под названием $$$.BAT.
Любые файлы с таким REM именем или расширением в этой директории будут
уничтожены. | REM
| REM Уничтожение
времменных файлов:
| IF EXIST *.$$$ DEL *.$$$ > NUL
| IF EXIST $$$.BAT DEL $$$.BAT > NUL
| REM Проверка первой переменной
| IF NOT "%1" == "" GOTO OKAY_#1
|
ECHO.
| ECHO Введите первую
переменную
| GOTO GETPARAM
| :OKAY_#1
| REM
Проверка второй переменной
| IF NOT "%2"
== "" GOTO OKAY_#2
|
ECHO.
| ECHO Введите вторую
переменную
| GOTO
GETPARAM
| :OKAY_#2
| REM Проверка третьей переменной
| IF NOT "%3" == "" GOTO OKAY_#3
| ECHO.
| ECHO
Введите третью переменную
| GOTO
GETPARAM
| :OKAY_#3
| REM Не много ли переменных?
| IF "%4" == "" GOTO ALL_OKAY
| ECHO.
| ECHO
Вы ввели много переменных. Программе требуется только три!
| ECHO а Вы ввели четвертую %4.
| GOTO END
|
:ALL_OKAY
| ECHO.
| ECHO My name is %0
|
ECHO Variable 1: %1
| ECHO Variable 2:
%2
| ECHO Variable 3: %3
| GOTO END
|
:GETPARAM
| ECHO Нажмите Ctrl-Z, затем
ENTER.
| COPY CON USER.$$$ >
NUL
| ECHO %0 %1 %2 %3 >
CMD.$$$
| COPY CMD.$$$ + USER.$$$
TEMP.$$$ > NUL
| NOCTRL < TEMP.$$$
> $$$.BAT
| $$$
| :END
|