• Командный интерпретатор. Командный язык системы unix. интерпретатор shell

    Оболочкой (shell) в системеUNIXназывают механизм взаимодействия между пользователями и системой. По сути дела, это интерпретатор команд, который считывает набираемые пользователем строки и запускает выполнение запрошен­ных системных функций. Полный командный язык, интерпретируемый оболоч­кой, богат по возможностям и достаточно сложен, однако большинство команд просты в использовании и запомнить их не составляет труда.

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

    Любой командный язык семейства shellфактически состоит из трёх частей:

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

     встроенных команд, выполняемых непосредственно интерпретатором команд­ного языка;

     команд, представляемых отдельными выполняемыми файлами.

    В свою очередь, набор команд последнего вида включает стандартные команды (системные утилиты, такие как vi,ccи т. д.) и команды, созданные пользователями системы. Для того чтобы выполняемый файл, разработанный пользовате­лем ОСUNIX, можно было запускать как командуshell, достаточно определить в одном из исходных файлов функцию с именемmain(имяmainдолжно быть глобальным, то есть перед ним не должно указываться ключевое словоstatic). Если употребить в качестве имени команды имя такого выполняемого файла, команд­ный интерпретатор создаст новый процесс и запустит в нём указанную выпол­няемую программу, начиная с вызова функцииmain.

    Тело функции main, вообще говоря, может быть произвольным (для интерпрета­тора существенно только наличие входной точки в программу с именемmain), но для того, чтобы создать команду, которой можно задавать параметры, нужно придерживаться некоторых стандартных правил. В этом случае каждая функцияmainдолжна определяться с двумя параметрами –argcиargv. После вызова ко­манды параметруargcбудет соответствовать число символьных строк, указан­ных в качестве аргументов вызова команды, аargv– массив указателей на пе­ременные, содержащие эти строки. При этом имя самой команды составляет первую строку аргументов (то есть после вызова значениеargcвсегда больше или равно 1). Код функцииmainдолжен проанализировать допустимость задан­ного значенияargcи соответствующим образом обработать заданные текстовые строки.

    Например, следующий текст на языке С может быть использован для создания команды, которая выводит на экран текстовую строку, заданную в качестве её аргумента:

    #include

    main(argc, argv)

    printf(“usage: %s your-text\n”, argv);

    printf(“%s\n”, argv);

    Процессы

    Процесс в ОС UNIXпонимается в классическом смысле этого термина, то есть как программа, выполняемая в собственном виртуальном адресном пространст­ве. Когда пользователь входит в систему, автоматически создается процесс, в ко­тором выполняется программа командного интерпретатора. Если командному интерпретатору встречается команда, соответствующая выполняемому файлу, то он создает новый процесс и запускает в нём соответствующую программу, начи­ная с функцииmain. Эта запущенная программа, в свою очередь, может создать процесс и запустить в нём другую программу (она тоже должна содержать функ­циюmain) и т. д.

    Для образования нового процесса и запуска в нём программы используются два системных вызова API–fork() и ехес(имя_выполняемого_файла). Системный вызовforkприводит к созданию нового адресного пространства, состояние которого абсолютно идентично состоянию адресного пространства основного процесса (то есть в нём содержатся те же программы и данные). Для дочернего процесса заво­дятся копии всех сегментов данных.

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

    управление и в том и в другом находится в точке, непосредственно следующей за вызовом fork. Чтобы программа могла разобраться, в каком процессе она те­перь работает – в основном или порождённом, функцияforkвозвращает разные значения: 0 в порождённом процессе и целое положительное число (идентифи­катор порождённого процесса – так называемыйPID) в основном процессе.

    Теперь, если мы хотим запустить новую программу в порождённом процессе, нужно обратиться к системному вызову ехес, указав в качестве аргументов вызо­ва имя файла, содержащего новую выполняемую программу, и, возможно, одну или несколько текстовых строк, которые будут переданы в качестве аргументов функции mainновой программы. Выполнение системного вызова ехес приводит к тому, что в адресное пространство порожденного процесса загружается но­вая выполняемая программа и запускается с адреса, соответствующего входу в функциюmain. Другими словами, это приводит к замене текущего программно­го сегмента и текущего сегмента данных, которые были унаследованы при вы­полнении вызоваfork, на новые соответствующие сегменты, заданные в файле. Прежние сегменты теряются. Это эффективный метод смены выполняемой про­цессом программы, но не самого процесса. Файлы, уже открытые до выполнения примитива ехес, остаются открытыми после его выполнения.

    В следующем примере пользовательская программа, вызываемая как команда shell, выполняет в отдельном процессе стандартную командуshellls, которая выдаёт на экран содержимое текущего каталога файлов.

    if (fork ()==(0) wait(0); /* родительский процесс */

    else execl("ls", "Is", 0); /* порождённый процесс */

    Таким образом, с практической точки зрения процесс в UNIXявляется объектом, создаваемым в результате выполнения функцииfork(). Каждый процесс, за исключением начального (нулевого), порождается в результате запуска дру­гим процессом операции fork(). Каждый процесс имеет одного родителя, но мо­жет породить много процессов. Начальный (нулевой) процесс является особенным процессом, который создается в результате загрузки системы. После порожде­ния нового процесса с идентификатором 1 нулевой процесс становится процес­сом подкачки и реализует механизм виртуальной памяти. Процесс с идентифика­тором 1, известный под именемinit, является предком любого другого процесса в системе и связан с каждым процессом особым образом.

    Аннотация: Рассматриваются внутренние команды, поддерживаемые интерпретатором Cmd.exe, и наиболее часто используемые внешние команды (утилиты командной строки). Описываются механизмы перенаправления ввода/вывода, конвейеризации и условного выполнения команд. Даются примеры команд для работы с файловой системой

    Оболочка командной строки Windows. Интерпретатор Cmd.exe

    В операционной системе Windows , как и в других операционных системах, интерактивные (набираемые с клавиатуры и сразу же выполняемые) команды выполняются с помощью так называемого командного интерпретатора, иначе называемого командным процессором или оболочкой командной строки ( command shell ). Командный интерпретатор или оболочка командной строки - это программа , которая, находясь в оперативной памяти, считывает набираемые вами команды и обрабатывает их. В Windows 9x, как и в MS-DOS , командный интерпретатор по умолчанию был представлен исполняемым файлом command . com . Начиная с версии Windows NT, в операционной системе реализован интерпретатор команд Cmd.exe, обладающий гораздо более мощными возможностями.

    Запуск оболочки

    В Windows NT/2000/XP файл Cmd.exe, как и другие исполняемые файлы, соответствующие внешним командам операционной системы, находятся в каталоге %SystemRoot%\SYSTEM32 (значением переменной среды %SystemRoot% является системный каталог Windows, обычно C:\Windows или C:\WinNT). Для запуска командного интерпретатора (открытия нового сеанса командной строки) можно выбрать пункт Выполнить… (Run) в меню Пуск (Start), ввести имя файла Cmd.exe и нажать кнопку OK. В результате откроется новое окно (см. рис. 2.1), в котором можно запускать команды и видеть результат их работы.


    Рис. 2.1.

    Внутренние и внешние команды. Структура команд

    Некоторые команды распознаются и выполняются непосредственно самим командным интерпретатором - такие команды называются внутренними (например, COPY или DIR ) Другие команды операционной системы представляют собой отдельные программы, расположенные по умолчанию в том же каталоге, что и Cmd.exe, которые Windows загружает и выполняет аналогично другим программам. Такие команды называются внешними (например, MORE или XCOPY ).

    Рассмотрим структуру самой командной строки и принцип работы с ней. Для того, чтобы выполнить команду, вы после приглашения командной строки (например, C:\> ) вводите имя этой команды (регистр не важен), ее параметры и ключи (если они необходимы) и нажимаете клавишу . Например:

    C:\>COPY C:\myfile.txt A:\ /V

    Имя команды здесь - COPY , параметры - C:\myfile.txt и A:\ , а ключом является /V . Отметим, что в некоторых командах ключи могут начинаться не с символа /, а с символа – (минус), например, -V .

    Многие команды Windows имеют большое количество дополнительных параметров и ключей, запомнить которые зачастую бывает трудно. Большинство команд снабжено встроенной справкой, в которой кратко описываются назначение и синтаксис данной команды. Получить доступ к такой справке можно путем ввода команды с ключом / ?. Например, если выполнить команду ATTRIB / ?, то в окне MS-DOS мы увидим следующий текст:

    Отображение и изменение атрибутов файлов. ATTRIB [+R|-R] [+A|-A] [+S|-S] [+H|-H] [[диск:][путь]имя_файла] + Установка атрибута. - Снятие атрибута. R Атрибут "Только чтение". A Атрибут "Архивный". S Атрибут "Системный". H Атрибут "Скрытый". /S Обработка файлов во всех вложенных папках указанного пути.

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

    В этом случае после заполнения очередного экрана вывод помощи будет прерываться до нажатия любой клавиши. Кроме того, используя символы перенаправления вывода > и >> , можно текст, выводимый на экран, направить в текстовый файл для дальнейшего просмотра. Например, для вывода текста справки к команде XCOPY в текстовый файл xcopy.txt, используется следующая команда:

    XCOPY /? > XCOPY.TXT

    Замечание

    Вместо имени файла можно указывать обозначения устройств компьютера. В Windows поддерживаются следующие имена устройств: PRN (принтер), LPT1 –LPT3 (соответствующие параллельные порты), AUX (устройство, присоединяемое к последовательному порту 1), COM1–COM3 (соответствующие последовательные порты), CON (терминал: при вводе это клавиатура, при выводе - монитор), NUL (пустое устройство, все операции ввода/вывода для него игнорируются).

    Перенаправление ввода/вывода и конвейеризация (композиция) команд

    Рассмотрим более подробно поддерживаемые в Windows UNIX-подобные концепции переназначения устройств стандартного ввода/вывода и конвейерного выполнения команд.

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

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

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

    команда > имя_файла

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

    команда >> имя_файла

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

    команда < имя_файла

    Приведем несколько примеров перенаправления ввода/вывода.

    1. Вывод встроенной справки для команды COPY в файл copy.txt:

      COPY /? > copy.txt

    2. Добавление текста справки для команды XCOPY в файл copy.txt:

      XCOPY /? >> copy.txt

    3. Ввод новой даты из файла date.txt (DATE - это команда для просмотра и изменения системной даты):

      DATE < date.txt

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

    команда 2> имя_файла

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

    В Linux нет отдельного объекта под именем «система». Система - она на то и система, чтобы состоять из многочисленных компонентов, взаимодействующих друг с другом. Главный из системных компонентов - пользователь. Это он командует машиной, а та его команды выполняет. В руководствах второго и третьего разделов описаны системные вызовы (функции ядра) и библиотечные функции. Они-то и есть непосредственные команды системе. Правда, воспользоваться ими можно только написав программу (чаще всего - на языке Си), нередко - программу довольно сложную. Дело в том, что функции ядра реализуют низкоуровневые операции, и для решения даже самой простой задачи пользователя необходимо выполнить несколько таких операций, преобразуя результат работы одной для нужд другой. Возникает необходимость выдумать для пользователя другой - более высокоуровневый и более удобный в использовании - язык управления системой. Все команды, которые использовал Мефодий в работе, были частью именно этого языка.

    Из чего несложно было заключить, что обрабатывать эти команды, превращать их в последовательность системных и библиотечных вызовов должна тоже какая-нибудь специальная программа, и именно с ней непрерывно ведёт диалог пользователь сразу после входа в систему. Так оно и оказалось: программа эта называется интерпретатор командной строки или командная оболочка («shell»). «Оболочкой» она названа как раз потому, что всё управление системой идёт как бы «изнутри» неё: пользователь общается с нею на удобном ему языке (с помощью текстовой командной строки), а она общается с другими частями системы на удобном им языке (вызывая запрограммированные функции).

    Таким образом, упомянутые выше правила разбора командной строки - это правила, действующие именно в командном интерпретаторе: пользователь вводит с терминала строку, shell считывает её, иногда - преобразует по определённым правилам, получившуюся строку разбивает на команду и параметры, а затем выполняет команду, передавая ей эти параметры. Команда, в свою очередь, анализирует параметры, выделяет среди них ключи, и делает что попросили, попутно выводя на терминал данные для пользователя, после чего завершается. По завершении команды возобновляется работа «отступившего на задний план» командного интерпретатора, он снова считывает командную строку, разбирает её, вызывает команду... Так продолжается до тех пор, пока пользователь не скомандует оболочке завершиться самой (с помощью logout или управляющего символа « ^D », который для shell значит то же, что и для других программ: больше с терминала ввода не будет).

    Конечно, командных интерпретаторов в Linux несколько. Самый простой из них, появившийся в ранних версиях UNIX, назывался sh , или «Bourne Shell» - по имени автора, Стивена Борна (Stephen Bourne). Со временем его - везде, где только можно - заменили на более мощный, bash , «Bourne Again Shell».

    Игра слов: «Bourne Again» вслух читается как «born again», т. е. «возрождённый».

    bash превосходит sh во всём, особенно в возможностях редактирования командной строки. Помимо sh и bash в системе может быть установлен «The Z Shell», zsh , самый мощный на сегодняшний день командный интерпретатор (шутка ли, 22 тысячи строк документации), или tcsh , обновлённая и тоже очень мощная версия старой оболочки «C Shell», синтаксис команд которой похож на язык программирования Си.

    Когда Гуревич добавлял учётную запись Мефодия в систему, он не стал спрашивать того, какой командный интерпретатор ему нужен, потому что знал: для новичка имя командного интерпретатора - пустой звук. Тем не менее имя оболочки, запускаемой для пользователя сразу после входа в систему - т. н. стартовый командный интерпретатор (login shell), - это часть пользовательской учётной записи, которую пользователь может изменить командой chsh (change shell).

    Какая бы задача, связанная с управлением системой, ни встала перед пользователем Linux, она должна иметь решение в терминах командного интерпретатора. Фактически, решение пользовательской задачи - это описание её на языке shell. Язык общения пользователя и командного интерпретатора - это высокоуровневый язык программирования, дополненный, с одной стороны, средствами организации взаимодействия команд и системы, а с другой стороны - средствами взаимодействия с пользователем, облегчающими и ускоряющими работу с командной строкой.

    Иллюстрация 2. Интерфейс командной строки. Издание второе, переработанное и дополненное. Взаимодействие пользователя с компьютером посредством терминала и оболочки.

    Команды и утилиты

    $ apropos s . . . (четыре с половиной тысячи строк!)

    Пример 18 . Бессмысленная команда

    Одного неудачного запуска apropos Мефодию было достаточно для того, чтобы понять: команд в Linux очень много. Ему пришло в голову, что никакая программа - пусть даже и оболочка - не может самостоятельно разбираться во всех задокументированных командах. Кроме того, Гуревич называл большинство команд утилитами , то есть полезными программами. Стало быть, командный интерпретатор не обязан уметь выполнять всё, что вводит пользователь. Ему достаточно разобрать командную строку, выделить из неё команду и параметры, а затем запустить утилиту - программу, имя которой совпадает с именем команды.

    В действительности собственных команд в командном интерпретаторе немного. В основном это - операторы языка программирования и прочие средства управления самим интерпретатором. Все знакомые Мефодию команды, даже echo , существуют в Linux в виде отдельных утилит. shell занимается только тем, что подготавливает набор параметров в командной строке (например, раскрывая шаблоны ), запускает программы и обрабатывает результаты их работы.

    $ type info info is /usr/bin/info $ type echo echo is a shell builtin $ type -a echo echo is a shell builtin echo is /bin/echo $ type -a -t echo builtin file $ type -a -t date file $ type -at cat file

    Пример 19 . Определение типа команды

    В bash тип команды можно определить с помощью команды type . Собственные команды bash называются builtin (встроенная команда), а для утилит выводится путь , содержащий название каталога, в котором лежит файл с соответствующей программой, и имя этой программы. Некоторые - самые нужные - команды встроены в bash , даже несмотря на то, что они имеются в виде утилит (например, echo). Работает встроенная команда так же, но так как времени на её выполнение уходит существенно меньше, командный интерпретатор выберет именно её, если будет такая возможность. Ключ « -a » («a ll», конечно), заставляет type вывести все возможные варианты интерпретации команды, а ключ « -t » - вывести тип команды вместо пути.

    По совету Гуревича Мефодий сгруппировал ключи, написав « -at » вместо « -a -t ». Многие утилиты позволяют так делать, уменьшая длину командной строки. Если встречается параметрический ключ, он должен быть последним в группе, а его значение - следовать, как и полагается, после. Группировать можно только однобуквенные ключи.

    Слова и разделители

    При разборе командной строки shell использует понятие разделитель (delimiter). Разделитель - это символ, разделяющий слова; таким образом командная строка - это последовательность слов (которые имеют значение) и разделителей (которые значения не имеют). Для shell разделителями являются символ пробела, символ табуляции и символ перевода строки (который всё-таки может попасть между словами способом, описанным в лекциях Работа с текстовыми данными и Возможности командной оболочки). Количество разделителей между двумя соседними словами значения не имеет.

    Первое слово в тройке передаётся команде как первый параметр, второе - как второй и т. д. Для того, чтобы разделитель попал внутрь слова (и получившаяся строка с разделителем передалась как один параметр), всю нужную подстроку надо окружить одинарными или двойными кавычками:

    $ echo One Two Three One Two Three $ echo One "Two Three" One Two Three $ echo "One > > Ой. И что дальше? > А, кавычки забыл!" One Ой. И что дальше? А, кавычки забыл! $

    Пример 20 . Закавычивание в командной строке

    В первом случае команде echo было передано три параметра - « One », « Two » и « Three ». Она их и вывела, разделяя пробелом. Во втором случае параметров было два: « One » и « Two Three ». В результате эти два параметра были также выведены через пробел. В третьем случае параметр был всего один - от открывающего апострофа « "One » до закрывающего « ...забыл!" ». Всё время ввода bash услужливо выдавал Мефодию подсказку « > » - в знак того, что набор командной строки продолжается, но в режиме ввода содержимого кавычек.

    В этом разделе описаны команды и символы, имеющие специальное значение, которые позволяют:

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

    Интерпретатор SHELL является оболочкой всей операционной системой и выполняет интерфейсные функции между пользователем и ОС. Он перехватывает и интерпретирует все команды пользователя, формирует и выводит ответные сообщения.

    Помимо запуска на выполнение стандартных команд UNIX и исполняемых файлов, интерпретатор включает собственный язык, который по своим возможностям приближается к высокоуровневым языкам программирования. Этот язык позволяет создавать программы (shell-файлы, скрипты), которые могут включать операторы языка и команды UNIX. Такие файлы не требуют компиляции и выполняются в режиме интерпретации, но они должны обладать правом на исполнение (устанавливается с помощью команды chmod ).

    Общение пользователя с командным интерпретатором осуществляется вводом команд с клавиатуры после появления промпта (приглашения), обычно, символа "$". Введенную последовательность символов интерпретатор будет рассматривать либо как имя внутренней команды, либо как имя исполняемого файла.

    Процедуре (скрипту) shell могут быть переданы аргументы при запуске. Каждому из первых девяти аргументов ставится в соответствие позиционный параметр от $1 до $9 ($0 - имя самой процедуры), и по этим именам к ним можно обращаться из текста процедуры.

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

    Ниже приведены метасимволы, используемые shell :

    * ? - позволяют указывать сокращенные имена файлов при поиске по шаблону;

    & - означает, что команда будет выполняться в фоновом режиме;

    ; - разделяет команды в командной строке;

    Отменяет специальное значение символов, таких как *, ?, [, ], &, ;, <,

    "..." - отменяют значение пробела как разделителя и специальное значение

    всех символов;

    "..." - отменяют значение пробела как разделителя и специальное значение всех символов, за исключением $ и;

    > - перенаправляет вывод команды в файл;

    < - перенаправляет ввод команды из файла;

    >> - перенаправляет вывод команды, который должен быть добавлен в

    конец существующего файла;

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

    `...` - используется в паре; позволяет использовать вывод команды как

    аргументы в командной строке;

    $ - используется с позиционными параметрами и определенными поль-

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

    качестве подсказки shell .

    Кроме того, для удобства работы с файлами почти все командные интерпретаторы интерпретируют символы "?" и "*", используя их как шаблоны имен файлов (т.н. метасимволы ):

    • ? - один любой символ;
    • * - произвольное количество любых символов.

    Например: *.c - задает все файлы с расширением "c";

    pr???.* - задает файлы, имена которых начинаются с "pr", содержат пять символов и имеют любое расширение.

    Переменные языка shell

    Язык shell позволяет работать с переменными (без предварительного объявления). Имена переменных начинаются с буквы и могут включать буквы и цифры. Обращение к переменным начинается со знака "$".

    Пример. Переход к начальному каталогу пользователя: cd $HOME

    Оператор присваивания . Присвоение значений переменным осуществляется с помощью оператора `=" без пробелов.

    По умолчанию команды пакетного файла перед исполнением выводятся на экран, что выглядит не очень эстетично. С помощью команды ECHO OFF можно отключить дублирование команд, идущих после нее (сама команда ECHO OFF при этом все же дублируется). Например,

    REM Следующие две команды будут дублироваться на экране … DIR C:\ ECHO OFF REM А остальные уже не будут DIR D:\

    Для восстановления режима дублирования используется команда ECHO ON. Кроме этого, можно отключить дублирование любой отдельной строки в командном файле, написав в начале этой строки символ @, например:

    ECHO ON REM Команда DIR C:\ дублируется на экране DIR C:\ REM А команда DIR D:\ - нет @DIR D:\

    Таким образом, если поставить в самое начало файла команду

    @ECHO OFF

    то это решит все проблемы с дублированием команд.

    В пакетном файле можно выводить на экран строки с сообщениями. Делается это с помощью команды

    ECHO сообщение

    Например,

    @ECHO OFF ​ECHO Привет!

    Команда ECHO. (точка должна следовать непосредственно за словом "ECHO") выводит на экран пустую строку.

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

    Используя механизм перенаправления ввода/вывода (символы > и >>), можно направить сообщения, выводимые командой ECHO, в определенный текстовый файл. Например:

    @ECHO OFF ECHO Привет! > hi.txt ECHO Пока! >> hi.txt

    С помощью такого метода можно, скажем, заполнять файлы-протоколы с отчетом о произведенных действиях. Например:

    @ECHO OFF REM Попытка копирования XCOPY C:\PROGRAMS D:\PROGRAMS /s REM Добавление сообщения в файл report.txt в случае REM удачного завершения копирования IF NOT ERRORLEVEL 1 ECHO Успешное копирование >> report.txt

    Использование параметров командной строки

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

    Для доступа из командного файла к параметрам командной строки применяются символы %0, %1, …, %9 или %*. При этом вместо %0 подставляется имя выполняемого пакетного файла, вместо %1, %2, …, %9 - значения первых девяти параметров командной строки соответственно, а вместо %* - все аргументы. Если в командной строке при вызове пакетного файла задано меньше девяти параметров, то "лишние" переменные из %1 – %9 замещаются пустыми строками. Рассмотрим следующий пример. Пусть имеется командный файл copier.bat следующего содержания:

    @ECHO OFF CLS ECHO Файл %0 копирует каталог %1 в %2 XCOPY %1 %2 /S

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

    Copier.bat C:\Programs D:\Backup

    то на экран выведется сообщение

    Файл copier.bat копирует каталог C:\Programs в D:\Backup

    и произойдет копирование каталога C:\Programs со всеми его подкаталогами в D:\Backup.

    При необходимости можно использовать более девяти параметров командной строки. Это достигается с помощью команды SHIFT, которая изменяет значения замещаемых параметров с %0 по %9, копируя каждый параметр в предыдущий, то есть значение %1 копируется в %0, значение %2 – в %1 и т.д. Замещаемому параметру %9 присваивается значение параметра, следующего в командной строке за старым значением %9. Если же такой параметр не задан, то новое значение %9 - пустая строка.

    Рассмотрим пример. Пусть командный файл my.bat вызван из командной строки следующим образом:

    My.bat p1 p2 p3

    Тогда %0=my.bat, %1=p1, %2=p2, %3=p3, параметры %4 – %9 являются пустыми строками. После выполнения команды SHIFT значения замещаемых параметров изменятся следующим образом: %0=p1, %1=p2, %2=p3, параметры %3 – %9 – пустые строки.

    При включении расширенной обработки команд SHIFT поддерживает ключ /n, задающий начало сдвига параметров с номера n, где n может быть числом от 0 до 9.
    Например, в следующей команде:

    SHIFT /2

    параметр %2 заменяется на %3, %3 на %4 и т.д., а параметры %0 и %1 остаются без изменений.

    Команда, обратная SHIFT (обратный сдвиг), отсутствует. После выполнения SHIFT уже нельзя восстановить параметр (%0), который был первым перед сдвигом. Если в командной строке задано больше десяти параметров, то команду SHIFT можно использовать несколько раз.
    В командных файлах имеются некоторые возможности синтаксического анализа заменяемых параметров. Для параметра с номером n (%n) допустимы синтаксические конструкции (операторы), представленные в следующей таблице:

    Таблица 2.1. Операторы для заменяемых параметров

    Операторы

    Описание

    Переменная %n расширяется до полного имени файла

    Из переменной %n выделяется только имя диска

    Из переменной %n выделяется только путь к файлу

    Из переменной %n выделяется только имя файла

    Из переменной %n выделяется расширение имени файла

    Значение операторов N и X для переменной %n изменяется так, что они работают с кратким именем файла

    Проводится поиск по каталогам, заданным в переменной среды PATH, и переменная %n заменяется на полное имя первого найденного файла. Если переменная PATH не определена или в результате поиска не найден ни один файл, эта конструкция заменяется на пустую строку. Естественно, здесь переменную PATH можно заменить на любое другое допустимое значение

    Данные синтаксические конструкции можно объединять друг с другом, например:

    %~DPn - из переменной %n выделяется имя диска и путь,
    %~NXn - из переменной %n выделяется имя файла и расширение.

    Рассмотрим следующий пример. Пусть мы находимся в каталоге C:\TEXT и запускаем пакетный файл с параметром Рассказ.doc (%1=Рассказ.doc). Тогда применение операторов, описанных в таблице выше, к параметру %1 даст следующие результаты:

    %~F1=C:\TEXT\Рассказ.doc %~D1=C: %~P1=\TEXT\ %~N1=Рассказ %~X1=.doc %DP1=C:\TEXT\ %NX1=Рассказ.doc