Продолжаем цикл статей, посвященных программированию. На этот раз мы поговорим о... DOS! Удивлены? Нет, я не ошибся. Дело в том, что DOS — тоже своего рода язык программирования, а не просто операционная система. И его возможности выходят далеко за стандартный поочередный запуск программ. DOS, конечно, не подойдет для создания компьютерных игр. Тогда зачем мы его рассматриваем? Потому что DOS в качестве языка программирования очень необычен и чрезвычайно функционален. Ведь это и операционная система, и мощный скриптовый язык. С его помощью можно легко и быстро оптимизировать многие рутинные операции с файлами. Кроме того, с помощью DOS можно создавать загрузочные меню и даже красивые диалоговые мультиокна. Многие думают, что в век гигагерцев и всеобщего XP такая отсталая и нетехнологичная вещь, как DOS, вообще не нужна. Эти люди заблуждаются! Попробую их переубедить. Во-первых, многие не знают о продвинутых возможностях старой доброй дисковой операционки. Вот сегодня и узнают. Во-вторых, DOS будет почище любого "левого" скриптового языка. Буквально за несколько минут на нем можно написать процедуры для потоковой обработки файлов (например, для очистки определенного мусора с дисков или для "умного" перемещения файлов). В-третьих, в случае серьезного системного сбоя (которые случаются сплошь и рядом) кто нам починит протекшие мозги? Уж не безопасный ли режим досточтимого Windows? Нет, он тут не функционален. Придется доставать дискетку с DOS — уж он-то не откажет. DOS — очень полезная в игростроевском быту вещь и, вопреки мнению многих, очень удачно сочетается с Windows. Прочитав эту статью, вы убедитесь в его всемогуществе окончательно.
Есть такая ось... Для совсем уж новичков в компьютерном мире кратко расскажу, что есть DOS. Когда-то это была одна из самых популярных операционных систем. DOS — легендарное детище приснопамятной Microsoft, продержавшееся удивительно долго. Были в то время и другие операционки для PC (например, OS/2, PC DOS, DR DOS, PTS DOS и т.д.), но DOS победил их всех, взяв, как обычно, не качеством, а количеством. Визуально DOS — унылый черный экран с одинокой строчкой внизу. Для запуска программ, работы с папками (в то время они назывались директориями) и файлами, а также для других служебных операций, характерных для всех осей, приходилось набирать соответствующие команды. Norton тогда еще не придумали, и DOS был единственной возможноcтью хоть как-то работать с компьютером. Но даже когда появился Norton, пользователи не отказывались от DOS (на самом деле, "Нортон" — это всего лишь оболочка, которая без DOS работать не в состоянии), потому что некоторые специфические функции без него не выполнишь. Шло время, идея оконного интерфейса по цепочке от фирмы к фирме докатилась-таки до Microsoft, и появился он — великий Windows 3.1. Для пользователей PC это был настоящий праздник (наивные, они очень скоро постигли и обратную, мученическую сторону жизни пользователя окошек). Но суть оставалась той же — Windows 3.1 все еще не был полноценной операционной системой, только надстройкой над DOS. По-настоящему самостоятельным он стал только к версии 95. Но DOS остался — вместе с хитрым рекламным ходом о полной обратной совместимости. Да, под всеми окошками можно запускать программы для DOS, но какой ценой! Однако сейчас вы убедитесь, что при правильном использовании такой ненужный теперь DOS обретет второе дыхание. Где его найти? Пуск/Программы/Сеанс MS DOS. Перед вами появится черное окошко с белой текстовой строкой. Это так называемая эмуляция DOS. Обычно ее достаточно для повседневных нужд, но в случае тяжелого сбоя или специфической задачи пользуются настоящим DOS. Для этого надо перезагрузиться и держать нажатой клавишу F8. Появится меню. Надо выбрать строку, в которой фигурирует слово DOS (таких строк обычно несколько).
Полезные мелочи Для начала давайте познакомимся с несколькими полезными мелочами, которые хоть и не имеют прямого отношения к программированию, зато делают жизнь чуточку проще и веселее. У MS DOS очень разветвленная система команд и ключей. Ключи — это параметры команд, которые пишутся после команды через слэш. — Самый распространенный ключ — /?. Он выводит детальную справку по любой команде и всем ее ключам. — Команды MS DOS делятся на внутренние и внешние. Внутренние команды "зашиты" в командный интерпретатор и выполняются всегда. Внешние команды требуют для своего запуска специальные внешние файлы. Внешние команды — это независимые программы, входящие в состав DOS.
Вот такой меткой строчкой мы сразу убиваем трех зайцев: и ищем, и сортируем, и печатаем. — Если текст, выводимый какой-то командой, не помещается на экране, можно применить эту команду с ключом /p. Он вызывает постраничный просмотр информации, но действует не всегда. — В стандартном DOS есть командный интерпретатор простейшего языка программирования — qbasic. Иногда он может быть полезен. Но с файловой системой он работает плохо. — Если полетел загрузочный сектор диска, надо загрузиться с дискеты и набрать sys a: c:. Эта команда перемещает загрузочную область с дискеты на винчестер. Внимание! Если версия Windows, в которой создавалась дискета, отличается от версии, установленной на компьютере, — может произойти серьезный сбой. Так что используйте эту команду с умом. — Предположим, у вас есть очень крутая и навороченная программа для... ну, например, верстки. Вы сверстали красивую газету и хотите ее распечатать, а принтера нет. Что делать? Правильно, идем к другу, у которого принтер есть. Но вот незадача — у него нет этой программы. А устанавливать ее на компьютер друга либо долго, либо вообще невозможно (например, нет свободного места или дистрибутива). Тупик? Как бы не так. И снова добрый доктор DOS нам поможет. В абсолютно любой программе, поддерживающей печать, есть функция "Печать в файл". Она позволяет создать битовый образ печатаемого документа. Этот образ может быть легко распечатан на любом принтере, причем не играет роли, что на той машине не установлена программа или какие-то экзотические шрифты, — все уже заложено в образ. Если есть такая замечательная возможность, почему ей мало кто пользуется? Потому что команда запуска печати из файла может быть введена только из-под DOS. Допустим, образ документа хранится в файле obras.doc. Тогда команда печати из файла будет выглядеть так: copy obras.doc prn /b. Особо любознательные могут воскликнуть: ведь это же команда копирования! Все правильно. Эта конструкция в очередной раз доказывает гибкость DOS. Мы как бы копируем документ в память принтера, попутно переводя ее в двоичный формат (за это отвечает ключ /b). — Кстати, с командой copy можно привести еще один интересный пример. Как бы вы объединили тексты, находящиеся в трех разных документах, в один? Наверняка открыли бы в каком-нибудь текстовом редакторе и начали вставлять-копировать кусочки файлов. Долго и неэффективно. Я бы сделал так: copy 1.txt+2.txt+3.txt all.txt. В итоге в all.txt оказывается содержимое всех трех файлов. Просто, быстро и удобно. Хоть DOS был и "унылой" операционкой, но до ТАКИХ возможностей Windows будет еще долго расти. Мы познакомились с некоторыми полезными и интересными возможностями DOS. А теперь переходим к... нет, не к программированию, а к вещам, имеющим к нему прямое отношение. Речь идет о командах конвейерной обработки.
Равнение на конвейер При переходе от DOS к Windows появился удобный и практичный интерфейс и куча новых возможностей. Но при этом были и серьезные потери. Одной из самых болезненных потерь являются функции конвейерной обработки данных. Действие, которое в DOS можно было сделать одной командой, в Windows приходится делать вручную иногда часами. Но ведь DOS у нас остался, а значит, можно использовать его возможности на все сто. Образуется очень симпатичный симбиоз: со стороны Windows — в удобстве, комфорте и простоте, а со стороны DOS — в практичности и функциональности. Для начала рассмотрим операцию переназначения. По умолчанию каждая команда выводит все результаты своей деятельности на экран и получает входные параметры с клавиатуры. В некоторых случаях это бывает неудобно. Вот для таких случаев и предназначены команды переназначения. Для того чтобы показать программе, что надо выводить результаты своей работы не на экран, а куда-то еще, используется символ >. В общем случае такая конструкция выглядит как команда >адресат. Где это может быть полезно? Например, вы хотите приклеить над монитором дерево папок вашего жесткого диска. Список надо распечатать. Как это можно быстро сделать в Windows? Очень сложно. А в DOS можно просто набрать строчку tree >prn, и из принтера тотчас же полезет бумага с распечатанным деревом папок. Слово prn в любых конструкциях обозначает принтер. Это так называемая объектная переменная. В DOS есть еще несколько интересных объектных переменных. Самая полезная из них — nul. То есть ноль. Что будет, если что-нибудь отправить в пустоту? Да ничего не будет. Только это что-то определенно не выведется на экран. Например, если в autoexec.bat (для тех, кто не знает: это командный файл, доставшийся Windows в наследство от DOS) после каждой строчки приписать >nul, то во время загрузки системы на экран не будут выводиться утомительные надписи о том, что у нас в который раз установилась кодовая страница, что наш CD-ROM не нашел своих драйверов, и тому подобные. Кто ценит свои нервы — можете убрать эти надписи. Результат работы любой команды можно также сбросить в файл. Например, если набрать dir >dir.txt, то в файле dir.txt окажется список папок текущей директории. Причем, если этот файл не существовал, он будет создан, а если существовал — то перед записью полностью очистится. Чтобы содержимое файла не стерлось, а новая запись добавилась к предыдущим, надо просто использовать вместо одинарного знака двойной, то есть >>. Таким способом очень удобно вести системные логи — записывать в специальный файл результат работы всех запускавшихся программ. Эта возможность будет особо полезна для системных администраторов. Да и в юзерском хозяйстве часто пригождается. Существует еще один символ переназначения: <. В противоположность предыдущей директиве, он сообщает команде не куда отправить результат своей работы, а откуда принимать. Пример. Вы очень часто пользуетесь какой-то составной командой с кучей параметров. Надоело каждый раз набивать ее? Просто запишите все эти ключи и параметры в файл, а потом вам придется только набрать саму команду и имя файла вот так: команда <источник. Так можно автоматизировать некоторые действия. Теперь перейдем к командам конвейерной обработки. Все эти команды пишутся после основной команды и всех ее параметров и начинаются с символа | (вертикальная черта). Их суть состоит в том, что все результаты работы предыдущей программы передаются на конвейерную обработку следующей. Самый наглядный пример — команда |more. Она организует постраничный вывод на экран информации, переданной ей предыдущей программой. Команда будет очень полезна в сочетании с теми командами, для которых не действует ключ /p. Конвейерную обработку можно производить не какими-то специальными командами, а абсолютно любыми. И всегда первая программа передает результат своей работы следующей. Это уже элементы программирования. Конструкция dir |sort выведет на экран список всех папок, отсортированный по алфавиту. Разные команды и конструкции можно объединять. Возможна такая строка: find "abc" |sort >prn. Как вы думаете, что сделает эта команда? Она найдет все файлы в текущей папке, в которых встречается строка "abc", отсортирует их по алфавиту и полученный список распечатает. Обратите внимание: данные как бы по эстафете передаются от одной команды к другой. Кто-то еще сомневается в наличии у "забытого DOS" мощных возможностей?! Основные хитрости DOS мы разобрали, а теперь перейдем к самому интересному — к программированию.
Что нам стоит дом построить? Основной объект программирования в
Самое удобное средство для редактирования bat-файлов - "Блокнот". DOS — это bat-файлы. Если говорить современным языком (помню, учителя информатики их так называли...), это обычные скрипты, которые автоматизируют некоторые рутинные операции. Любым таким скриптом можно запустить программу и из-под DOS, и из-под Windows. Они представляют собой обычные текстовые файлы с расширением .bat. Вы можете создать этих файлов сколько угодно и использовать их по своему усмотрению. Но обычно с их помощью делаются какие-то сложные операции. Например, с файловой системой. Операции, которые вручную делать долго и нудно. Практика показала, что создавать и редактировать командные скрипты все-таки удобнее из-под Windows, чем из-под DOS. И делать это лучше в обычном "Блокноте". А посему закройте DOS-окно и откройте "Блокнот". По структуре скрипт для DOS (который, как я уже говорил, может легко применяться в Windows) очень похож на Basic. Каждая команда пишется на новой строчке. Команда обычно состоит из собственно командного слова, параметров и различных приставок через пробелы. Внимание! Все команды, которые пишутся в bat-файле, — стандартные команды DOS. Ничего нового или специального там нет. Давайте создадим простейший скрипт. Допустим, у вас есть какой-то вордовский текст, с которым вы часто работаете. Чтобы каждый раз не открывать Word и не загружать в него требуемый файл (который еще и найти надо), можно создать простенький скрипт, который будет выполнять все это за нас, и поместить его на рабочий стол. Откройте "Блокнот" и напишите такую строчку: с:\Program files\Microsoft Office\Office\winword.exe c:\mytext.doc. Естественно, на месте первого пути должен стоять путь до исполняемого файла Word(хотя я написал самый распространенный вариант), а на месте второго пути — путь до вашего документа. Теперь сохраните полученный файл на рабочий стол с каким-нибудь понятным именем. А теперь просто измените расширение файла с .txt на .bat. Запустите файл. Загрузился Word, а в нем автоматически открылся ваш документ. Теперь этим скриптом можно пользоваться всегда. Просто, быстро и удобно. В bat-файле можно последовательно писать любые команды DOS. Например, элементарную команду форматирования можно оформить следующим образом: @echo off @echo Создаем загрузочную дискету... format a: /S @echo Загрузочная дискета создана Перед вами удобный скрипт для создания загрузочной дискеты. Давайте рассмотрим его по строчкам. Первая строчка отключает вывод лишних сообщений. Это очень полезная команда. Помните, я советовал поставить в конце каждой строчки в autoexec.bat приставку >nul? Если поставить в самом начале этого файла @echo off, эффект будет тот же. Команда @echo служит для вывода на экран текстовых сообщений. Например, мы выводим пояснения текущих действий во второй и четвертой строчках. А третья строчка — собственно команда форматирования с переносом на дискету системных файлов (за это отвечает ключ /S). Удобно, не правда ли? Есть еще одна замечательная возможность — косвенное указание команд и параметров. Предположим, нам необходимо получить скрипт, который удалял бы в текущей папке все файлы с заданным расширением. Причем расширения могут быть самыми разными. Не создавать же сотню командных файлов для удаления каждого типа файлов. Но это и не нужно. Достаточно один раз написать команду удаления файла, а в качестве расширения файла указать символ подстановки значения в качестве параметра. Ведь наш скрипт — почти программа. А значит, и его можно вызвать с параметром. Так почему бы не вызывать скрипт с параметром-типом файлов для удаления. Например, вздумав одним махом удалить все текстовые файлы, можно было бы просто написать script.bat txt. Как видите, определение txt является в данном случае параметром, который передается в наш скрипт. Все это, конечно, хорошо, только вот как этот параметр принять и обработать внутри скрипта? Очень просто. Можно использовать символ подстановки %1. Перед запуском скрипта этот %1 автоматически будет заменен на наш параметр везде в тексте скрипта, где встретится. Если требуется не один, а более входных параметров, можно писать %2, %3, ну и так далее. Посмотрим, каким же окажется наш скрипт на деле. Он будет состоять всего из одной короткой строчки: del *.%1 Команда del, я думаю, всем знакома. В качестве параметра у нее — маска всех файлов с любыми именами и расширениями, соответствующими текущему значению %1. Если мы вызовем скрипт script.bat txt, то вместо %1 подставится txt, и скрипт превратится в: del *.txt Результатом выполнения этой команды будет удаление всех файлов с расширением .txt. Возможность подстановки не ограничивается только параметрами команд. Можно подставлять целые команды и даже куски скриптов. Если в скрипте будет одна-единственная строчка %1, то любой параметр скрипта будет автоматически обработан как команда. Если после имени скрипта мы напишем имя программы, она запустится. И так далее. Область применения этой возможности обширна. Именно такие вещи и делают скриптовый язык гибким. Но возможности bat-файлов не ограничиваются простым последовательным выполнением команд и подстановок. Они обладают развитой системой команд, подобной тому же самому Basic. Давайте теперь создадим скрипт посложнее. Например, нам хочется по двойному клику на иконку рабочего стола вызывать специальное текстовое меню, которое бы предлагало выбрать программу или игру для запуска. Ведь раз у нас есть возможность писать скрипты, зачем каждый раз для запуска любимой игры или программы тянуться в главное меню, а то и в "Мой компьютер"? Даже ярлыки на рабочем столе не спасают положение: вскоре их число становится таким, что найти там что-то — большая проблема. Решим проблему. Нам требуется скрипт, который бы выводил на экран меню со списком наших любимых программ/игр и предлагал возможность выбора. Лучше всего, если бы нам не требовалось каждый раз нажимать Enter — просто нажать клавишу, соответствующую нужному варианту. Тогда запуск будет быстрым и удобным. В этом нам поможет команда choice. Давайте посмотрим на текст скрипта. choice /c:TOSW Что бы сегодня запустить:
Наше меню в действии. Тетрис (T), Operation Flashpoint (O), Serious Sam (S), Word (W) if errorlevel 4 goto word if errorlevel 3 goto sam if errorlevel 2 goto operation if errorlevel 1 goto tetris :tetris c:\games\tetris\tetris.exe goto end peration c:\games\Flashpoint\OperationFlashpoint.exe goto end :sam c:\games\Sam\Bin\SeriousSam.exe goto end :word с:\Program files\Microsoft Office\Office\winword.exe goto end :end Вот и весь скрипт. Когда мы запустим его, на экране появится меню из четырех пунктов. Рядом с каждым пунктом в скобках указана соответствующая клавиша. Нам достаточно нажать эту клавишу, чтобы запустить ту или иную игру или программу. А теперь давайте разберемся, как этот скрипт устроен. Самая первая команда — choice. Она отвечает за вывод на экран вопроса и обработку ответов. После ключа /c: пишутся буквы — варианты ответа. Если пользователь в ответ на вопрос нажмет одну из этих букв (впрочем, там могут быть любые символы), переменная errorlevel приобретет значение, соответствующее номеру выбранного варианта. Обратите внимание, что текст вопроса пишется без знака вопроса — он автоматически будет подставлен в конце. В переменной errorlevel сохранился выбранный пункт меню. Теперь его надо обработать. Для этого служит конструкция if. Это не что иное, как условие, которое проверяется на истинность. Если условие истинно, выполняется какое-то действие. Например, в первой строчке мы сравниваем значение errorlevel с 4 (этот номер соответствует пункту меню "Word"). Если значение совпадает (то есть пользователь выбрал именно этот пункт), выполняется команда goto word. Это команда перехода на метку. Метка служит для перехода в какую-то часть программы. Найдите строчку, где написано :word. Это и есть метка, на которую перескочит скрипт после выполнения команды. После метки будет выполняться команда запуска Word, а потом — снова переход на метку. На этот раз метка стоит в самом конце скрипта и ни на что не указывает. Скрипт кончается. Вот и весь принцип действия. Чтобы вы лучше себе это уяснили, попробуем проследить реакцию скрипта на выбор, скажем, Serious Sam. Скрипт запускается, и на экран выводится меню. Мы нажимаем клавишу S, и в переменной errorlevel оказывается значение 3. Два первых условия игнорируются, а третье срабатывает — и скрипт переходит на метку :sam. После метки идет команда запуска SeriousSam, он запускается, а скрипт по новой метке переходит в самый конец. Зачем нужен последний переход? Если бы его не было, скрипт бы пошел выполняться дальше и запустил бы еще и Word. А это нам совсем ни к чему.
И снова в бой... Теперь, когда вы постигли многие премудрости программирования в DOS, можно коротко пробежаться по его специфическим возможностям. — С помощью команды call можно из одного скрипта вызывать другой. В принципе, другой скрипт можно вызвать, просто запустив его как программу. Но команда call обеспечивает не только запуск другого скрипта, но и продолжение работы текущего скрипта после завершения вызванного. Только не стоит экспериментировать с рекурсивным вызовом скриптов. Это может привести к зависанию системы. — С помощью команды set можно установить значения переменных окружения, а также задать собственные переменные. Например, можно изменить значение переменной errorlevel. Вызывается эта команда так: set имя_переменной=значение. Учтите, что значения могут быть только текстовыми. — DOS может оперировать очень сложными символами масок. Знак вопроса заменяет один символ, звездочка — целую группу символов. Поэтому вполне возможна такая маска: ?a*с??.?h*. Маска *.* выделяет все файлы. — Команда device загружает в память драйвер соответствующего устройства. Обычно эта команда не используется в скриптах — только в config.sys. — Для установки значения некоторых переменных не нужна команда set. К таким переменным относятся files и buffers, которые отвечают за максимальное число одновременно открытых файлов и буферов. — Когда надо организовать задержку перед каким-то действием (или когда выполнилось одно действие и готовится выполняться второе), можно использовать команду pause. Она приостанавливает работу скрипта и выводит на экран сообщение "Нажмите любую клавишу...". Когда пользователь нажмет любую клавишу (помните бородатый анекдот про any key), выполнение скрипта продолжится. — Одна из самых интересных возможностей DOS — создание загрузочных меню. С их помощью можно заставить мирно сосуществовать десятки операционных систем, автоматизировать некоторые операции и даже исправлять баги загрузки. Создаются загрузочные меню путем изменения файла autoexec.bat, который — суть скрипт.
* * * Вот мы и рассмотрели основные возможности DOS в качестве мощного скриптового языка. Он надежней и удобней большинства скриптовых языков, которые массами бродят по Интернету. DOS незаслуженно забыт, но в новом свете обретает вторую жизнь. И этим стоит воспользоваться. В одном из ближайших номеров "Мании" мы поговорим о скриптовых языках и конфигурационных файлах в играх. Оказывается, разработчики не придумывают свои скриптовые языки наобум, а руководствуются некими общими основами. И узнав эти основы, вы сможете легко понять любой скриптовый язык в любой игре! Где это можно применить? Ну, например, при препарировании игры (киваю в сторону коллег-хирургов из "Вскрытия") или при разработке мода. Кроме того, если вы решите писать собственную игру, вы узнаете, как создавать скриптовые языки так, чтобы потом не было мучительно больно (в области висков) за бесцельно потраченное время на разработку нежизнеспособного скрипта.