Новости

Интерпретатор командной строки ОСMS Windows

Работа добавлена:






Интерпретатор командной строки ОСMS Windows на http://mirrorref.ru

Лабораторная работа  № 2

Интерпретатор командной строки ОСMSWindows

Часть 2.Язык интерпретатора икомандные файлы

Цель работы – знакомство с языком интерпретатора командной строки ОС MS Windows и командными файлами

1. КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

1.1 Язык интерпретатора Cmd.exe. Командные файлы

Язык оболочки командной строки (shell language) в Windows реализован в виде командных (или пакетных) файлов.Командный файл в Windows — это обычный текстовый файл с расширением bat или cmd, в котором записаны допустимые команды ОС (как внешние, так и внутренние), а также некоторые дополнительные инструкции и ключевые слова, придающие командным файлам некоторое сходство с программами, написанными на языке программирования. Например, если записать в файл deltmp.bat следующие команды:

C:\

CD %TEMP%

DEL /F *.tmp

и запустить его на выполнение (аналогично исполняемым файлам с расширением com или exe), то мы удалим все файлы во временной директории Windows. Таким образом, исполнение командного файла приводит к тому же результату, что и последовательный ввод записанных в нем команд. При этом не проводится никакой предварительной компиляции или проверки синтаксиса кода; если встречается строка с ошибочной командой, то она игнорируется. Очевидно, что если приходится часто выполнять одни и те же действия, то использование командных файлов может сэкономить много времени.

1.1.1. Вывод сообщений и дублирование команд

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

REM Следующие две команды будут дублироваться на экране …

:: эта строка – такой же комментарий, как и предыдущая

DIR C:\

ECHO OFF

:: А остальные уже не будут

DIR D:\

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

ECHO ON

:: Команда DIR C:\ дублируется на экране

DIR C:\

:: А команда DIR D:\ — нет

@DIR D:\

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

@ECHO OFF

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

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

ECHO сообщение

Например,

@ECHO OFF

ECHO Привет!

Команда ECHO. (точка должна следовать непосредственно за словом "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

:: Добавление сообщения в файл report.txt в случае удачного завершения копирования

IF NOT ERRORLEVEL 1 ECHO Успешное копирование >> report.txt

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

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

Для доступа из командного файла к параметрам командной строки применяются символы %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 — пустая строка.

Пример 1. Пусть командный файл 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) допустимы синтаксические конструкции (операторы), представленные втабл. 1.

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

Операторы

Описание

%~Fn

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

%~Dn

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

%~Pn

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

%~Nn

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

%~Xn

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

%~Tn

Возвращается дата и время создания (модификации) файла

%~Zn

Возвращается размер файла в байтах

%~$PATH:n

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

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

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

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

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

%~F1=C:\TEXT\Рассказ.doc

%~D1=C:

%~P1=\TEXT\

%~N1=Рассказ

%~X1=.doc

%~DP1=C:\TEXT\

%~NX1=Рассказ.doc

%~T1=12.12.2009 12:55

%~Z1=2150

1.1.3. Работа с переменными среды

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

WINDIR, которая определяет расположение каталога Windows,

TEMP, которая определяет путь к каталогу для хранения временных файлов Windows

PATH, в которой хранится системный путь (путь поиска), то есть список каталогов, в которых система должна искать выполняемые файлы или файлы совместного доступа (например, динамические библиотеки).

Кроме того, в командных файлах с помощью командыSET можно объявлять собственные переменные среды.

1.1.3.1. Получение значения переменной

Для получения значения определенной переменной среды нужно заключить имя этой переменной в символы%.Например:

@ECHO OFF

CLS

:: Создание переменной MyVar

SET MyVar=Привет

:: Изменение переменной

SET MyVar=%MyVar%

ECHO Значение переменной MyVar: %MyVar%

:: Удаление переменной MyVar

SET MyVar=

ECHO Значение переменной WinDir: %WinDir%

При запуске такого командного файла на экран выведется строка

Значение переменной MyVar: Привет!

Значение переменной WinDir: C:\WINDOWS

1.1.4. Преобразования переменных как строк

С переменными среды в командных файлах можно производить некоторые манипуляции.Во-первых, над ними можно производить операцию конкатенации (соединения). Для этого нужно в командеSETпросто написать рядом значения соединяемых переменных. Например,

SET A=Раз

SET B=Два

SET C=%A%%B%

После выполнения в файле этих команд значением переменной C будет являться строка'РазДва'.Не следует для конкатенации использовать знак+, так как он будет воспринят просто в качестве символа. Например, после запуска файл следующего содержания

SET A=Раз

SET B=Два

SET C=A+B

ECHOПеременная C=%C%

SET D=%A%+%B%

ECHO Переменная D=%D%

на экран выведутся две строки:

Переменная C=A+B

Переменная D=Раз+Два

Во-вторых, из переменной среды можновыделять подстроки с помощью конструкции%имя_переменной:~n1,n2%,где числоn1определяет смещение (количество пропускаемых символов) от начала (еслиn1положительно) или от конца (еслиn1отрицательно) соответствующей переменной среды, а числоn2количество выделяемых символов (еслиn2положительно) или количество последних символов в переменной, которые не войдут в выделяемую подстроку (еслиn2отрицательно). Если указан только один отрицательный параметр-n,то будут извлечены последниеnсимволов. Например, если в переменной хранится строка"21.12.2009"(символьное представление текущей даты при определенных региональных настройках), то после выполнения следующих команд

SET dd1=%DATE:~0,2%

SET dd2=%DATE:~0,-8%

SET mm=%DATE:~-7,2%

SET yyyy=%DATE:~-4%

новые переменные будут иметь такие значения:%dd1%=21, %dd2%=21, %mm%=12, %yyyy%=2009.

В-третьих, можно выполнять процедуру замены подстрок с помощью конструкции%имя_переменной:s1=s2%(в результате будет возвращена строка, в которой каждое вхождение подстрокиs1в соответствующей переменной среды заменено наs2). Например, после выполнения команд

SET a=123456

SET b=%a:23=99%

в переменнойbбудет храниться строка"199456".Если параметрs2не указан, то подстрокаs1будет удалена из выводимой строки, т.е. после выполнения команды

SET a=123456

SET b=%a:23=%

в переменнойbбудет храниться строка"1456".

1.1.5. Операции с переменными как с числами

При включенной расширенной обработке команд (этот режим в Windows XP используется по умолчанию) имеетсявозможность рассматривать значения переменных среды как числа и производить с ними арифметические вычисления (используются ТОЛЬКО целые числа). Для этого используется командаSETс ключом/A.Ниже приведен пример пакетного файла add.bat, складывающего два числа, заданных в качестве параметров командной строки, и выводящего полученную сумму на экран:

@ECHO OFF

:: В переменной M будет храниться сумма

SET /A M=%1+%2

ECHO Сумма %1 и %2 равна %M%

:: Удалим переменную M

SET M=

В командеSET с ключом /A могут использоваться операции – (вычитание), * (умножение), / (деление нацело), % (остаток от деления). При использовании знака % в качестве знака операции вкомандных файлах  он должен быть записан ДВАЖДЫ.

Рекомендуется при инициализации числовых переменных использовать ключ /A

SET /A col=0

1.1.6 Ввод значения переменной с клавиатуры

Ввод значения переменной при выполнении командного файла выполняется командойSET с ключом /P. Например, для ввода значения переменнойM следует использовать команду

SET /PM=[введитеM]

Текст подсказки [введите М] будет выведен на экран.

1.1.7. Локальные изменения переменных

Все изменения, производимые с помощью командыSETнад переменными среды в командном файле, сохраняются и после завершения работы этого файла, но действуют только внутри текущего командного окна. Также имеется возможность локализовать изменения переменных среды внутри пакетного файла, то есть автоматически восстанавливать значения всех переменных в том виде, в каком они былидо начала запуска этого файла. Для этого используются две команды:SETLOCALиENDLOCAL.КомандаSETLOCALопределяет начало области локальных установок переменных среды. Другими словами, изменения среды, внесенные после выполненияSETLOCAL,будут являться локальными относительно текущего пакетного файла. Каждая командаSETLOCALдолжна иметь соответствующую командуENDLOCALдля восстановления прежних значений переменных среды. Изменения среды, внесенные после выполнения командыENDLOCAL,уже не являются локальными относительно текущего пакетного файла; их прежние значения не будут восстановлены по завершении выполнения этого файла.

1.1.8. Связывание времени выполнения для переменных

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

SET a=1

ECHO a=%a%

SET a=2

ECHO a=%a%

и командный файл 2.bat:

SET a=1

ECHO a=%a%

(SET a=2

ECHO a=%a% )

Казалось бы, результат выполнения этих двух файлов должен быть одинаковым: на экран выведутся две строки:"a=1" и "a=2".На самом же деле таким образом сработает только файл 1.bat, а файл 2.bat два раза выведет строку"a=1".

Данную ошибку можно обойти, если для получения значения переменной вместо знаков процента(%)использовать восклицательный знак (!) и предварительно включить режим связывания времени выполнения командойSETLOCAL ENABLEDELAYEDEXPANSION.Таким образом, для корректной работы файл 2.bat должен иметь следующий вид:

SETLOCAL ENABLEDELAYEDEXPANSION

SET a=1

ECHO a=%a%

(SET a=2

ECHOa=!a!)

ВНИМАНИЕ! Приведенный материал необходим для правильной работы команды циклаFOR и будет использован в командных файлах!

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

Для того, чтобы вручнуюпрервать выполнение запущенного bat-файла, нужно нажать клавиши <Ctrl>+<C> или <Ctrl>+<Break>. Однако часто бывает необходимо программно приостановить выполнение командного файла в определенной строке с выдачей запроса на нажатие любой клавиши. Это делается с помощью команды PAUSE. Перед запуском этой команды полезно с помощью командыECHOинформировать пользователя о действиях, которые он должен произвести. Например:

ECHO Вставьте дискету в дисковод A: и нажмите любую клавишу

PAUSE

КомандуPAUSEобязательно нужно использовать при выполнении потенциально опасных действий (удаление файлов, форматирование дисков и т.п.). Например,

ECHO Сейчас будут удалены все файлы в C:\Мои документы!

ECHO Для отмены нажмите Ctrl-C

PAUSE

DEL "C:\Мои документы\*.*"

1.1.10. Вызов внешних командных файлов

Из одного командного файла можно вызвать другой, просто указав его имя. Например:

@ECHO OFF

CLS

REM Вывод списка log-файлов

DIR C:\*.log

:: Передача выполнения файлу f.bat

f.bat

COPY A:\*.* C:\

PAUSE

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

COPY A:\*.* C:\

(и все следующие за ней команды) никогда не будет выполнена.

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

Например: