Главная страница
Навигация по странице:

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

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

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

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

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

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

  • 1.1.11 Операторы перехода GOTO и вызова CALL

  • 1.1.12 Оператор проверки условия IF

  • ЛАБОРАТОРНЫЕ РАБОТЫ ОС (Для допуска необходимо сделать 1 или 6 л. Практикум по дисциплине Операционные системы (ОС). Цели лабораторных занятий это формирование у будущих бакалавров направлений подготовки 09. 03. 01


    Скачать 2.71 Mb.
    НазваниеПрактикум по дисциплине Операционные системы (ОС). Цели лабораторных занятий это формирование у будущих бакалавров направлений подготовки 09. 03. 01
    Дата15.10.2022
    Размер2.71 Mb.
    Формат файлаpdf
    Имя файлаЛАБОРАТОРНЫЕ РАБОТЫ ОС (Для допуска необходимо сделать 1 или 6 л.pdf
    ТипПрактикум
    #735270
    страница4 из 21
    1   2   3   4   5   6   7   8   9   ...   21

    переменными среды (или переменными окружения), каждая из которых хранится в оперативной памяти, имеет свое уникальное имя, а ее значением является
    строка.
    Стандартные переменные среды автоматически инициализируются в процессе загрузки операционной системы. Такими переменными являются:
     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

    32
    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.2015"
    (символьное представление текущей даты при определенных региональных настройках), то после выполнения следующих команд
    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%=2015.
    В-третьих, можно выполнять процедуру замены подстрок с помощью конструкции %имя_переменной:s1=s2% (в результате будет возвращена строка, в которой каждое вхождение подстроки s1
    в

    33 соответствующей переменной среды заменено на 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 используется по умолчанию) имеется
    возможность
    рассматривать значения переменных среды как числа и производить с ними арифметические вычисления (используются ТОЛЬКО целые числа).
    Для этого используется команда 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 /P M=[введите M]
    Текст подсказки [введите М] будет выведен на экран.
    1.1.7 Локальные изменения переменных
    Все изменения, производимые с помощью команды
    SET
    над переменными среды в командном файле, сохраняются и после завершения

    34 работы этого файла, но действуют только внутри текущего командного окна. Также имеется возможность локализовать изменения переменных среды внутри пакетного файла, то есть автоматически восстанавливать значения всех переменных в том виде, в каком они были до начала
    запуска этого файла. Для этого используются две команды:
    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

    35
    ECHO a=%a%
    (SET a=2
    ECHO a=!a!)
    ВНИМАНИЕ! Приведенный материал необходим для правильной работы команды цикла FOR и будет использован в командных файлах!
    1.1.9 Приостановка выполнения командных файлов
    Для того, чтобы вручную прервать выполнение запущенного bat- файла, нужно нажать клавиши + или +. Однако часто бывает необходимо программно приостановить выполнение командного файла в определенной строке с выдачей запроса на нажатие любой клавиши. Это делается с помощью команды 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:\
    (и все следующие за ней команды) никогда не будет выполнена.
    Для того, чтобы вызвать внешний командный файл с последующим возвратом в первоначальный файл, нужно использовать специальную

    36 команду CALL файл
    Например:
    @ECHO OFF
    CLS
    :: Вывод списка log-файлов
    DIR C:\*.log
    :: Передача выполнения файлу f.bat
    CALL f.bat
    COPY A:\*.* C:\
    PAUSE
    В этом случае после завершения работы файла f.bat управление вернется в первоначальный файл на строку, следующую за командой
    CALL
    (в нашем примере это команда
    COPY A:\*.* C:\
    ).
    1.1.11 Операторы перехода GOTO и вызова CALL
    Командный файл может содержать метки и команды
    GOTO
    перехода к этим меткам. Любая строка, начинающаяся с двоеточия :, воспринимается при обработке командного файла как метка. Имя метки задается набором символов, следующих за двоеточием до первого пробела или конца строки.
    Пример 3. Пусть имеется командный файл следующего содержания:
    @ECHO OFF
    COPY %1 %2
    GOTO Label1
    ECHO Эта строка никогда не выполнится
    :Label1
    :: Продолжение выполнения
    DIR %2
    После того, как в этом файле мы доходим до команды
    GOTO Label1 его выполнение продолжается со строки
    :: Продолжение выполнения
    В команде перехода внутри файла
    GOTO
    можно задавать в качестве метки перехода строку
    :EOF
    , которая передает управление в конец текущего пакетного файла (это позволяет легко выйти из пакетного файла без определения каких-либо меток в самом его конце).
    Для перехода к метке внутри текущего командного файла кроме команды
    GOTO
    можно использовать и рассмотренную выше команду
    CALL
    :
    CALL :метка аргументы
    При вызове такой команды создается новый контекст текущего пакетного файла с заданными аргументами, и управление передается на

    37 инструкцию, расположенную сразу после метки. Для выхода из такого пакетного файла необходимо два раза достичь его конца. Первый выход возвращает управление на инструкцию, расположенную сразу после строки
    CALL
    , а второй выход завершает выполнение пакетного файла.
    Например, если запустить с параметром "Копия-1"
    командный файл следующего содержания:
    @ECHO OFF
    ECHO %1
    CALL :2 Копия-2
    :2
    ECHO %1 то на экран выведутся три строки:
    Копия-1
    Копия-2
    Копия-1
    Таким образом, подобное использование команды
    CALL
    похоже на вызов подпрограмм в языках высокого уровня.
    1.1.12 Оператор проверки условия IF
    С помощью команды
    IF … ELSE
    (ключевое слово
    ELSE
    может отсутствовать) в пакетных файлах можно выполнять обработку условий нескольких типов. При этом если заданное после
    IF
    условие принимает истинное значение, система выполняет следующую за условием команду
    (или несколько команд, заключенных в круглые скобки), в противном случае выполняется команда (или несколько команд в скобках), следующие за ключевым словом
    ELSE
    1.1.12.1 Проверка значения переменной
    Первый тип условия используется обычно для проверки значения переменной. Для этого применяются два варианта синтаксиса команды
    IF
    :
    IF [NOT] строка1==строка2 команда1 [ELSE команда2]
    (квадратные скобки указывают на необязательность заключенных в них параметров) или
    IF [/I] [NOT] строка1 оператор_сравнения строка2 команда
    Рассмотрим сначала первый вариант. Условие строка1==строка2
    (здесь необходимо писать именно два знака равенства – как и в программах на С/C++) считается истинным при точном совпадении обеих строк. Параметр NOT указывает на то, что заданная команда выполняется лишь в том случае, когда сравниваемые строки не совпадают.
    Для группировки команд могут использоваться круглые скобки.
    Иногда использование круглых скобок необходимо для правильной работы команды if…else – например для вывода на экран наибольшего из двух

    38 параметров, с которыми запущен командный файл, следует использовать оператор if %1 GTR %2 (echo %1 ) else (echo %2)
    Строки могут быть литеральными или представлять собой значения переменных (например,
    %1
    или
    %TEMP%
    ). Кавычки для литеральных строк
    не требуются. Например,
    IF %1==%2 ECHO Параметры совпадают!
    IF %1==windows ECHO значение первого параметра - windows
    Отметим, что при сравнении строк, заданных переменными, следует проявлять определенную осторожность. Дело в том, что значение переменной может оказаться пустой строкой, и тогда может возникнуть ситуация, при которой выполнение командного файла аварийно завершится. Например, если вы не определили с помощью команды
    SET
    переменную
    MyVar
    , а в файле имеется условный оператор типа
    IF %MyVar%==C:\ ECHO Ура!!!, то в процессе выполнения вместо
    %MyVar%
    подставится пустая строка и возникнет синтаксическая ошибка.
    Такая же ситуация может возникнуть, если одна из сравниваемых строк является значением параметра командной строки, так как этот параметр может быть не указан при запуске командного файла. Поэтому при сравнении строк нужно приписывать к ним в начале какой-нибудь символ, например:
    IF -%MyVar%==-C:\ ECHO Ура!!!
    С помощью команд
    IF
    и
    SHIFT
    можно в цикле обрабатывать все параметры командной строки файла, даже не зная заранее их количества.
    Например, следующий командный файл (назовем его primer.bat) выводит на экран имя запускаемого файла и все параметры командной строки:
    @ECHO OFF
    ECHO Выполняется файл: %0
    ECHO.
    ECHO Файл запущен со следующими параметрами...
    :: Начало цикла
    :BegLoop
    IF -%1==- GOTO ExitLoop
    ECHO %1
    :: Сдвиг параметров
    SHIFT
    :: Переход на начало цикла
    GOTO BegLoop
    :ExitLoop
    :: Выход из цикла
    ECHO.
    ECHO Все.

    39
    Если запустить primer.bat с четырьмя параметрами: primer.bat A B C D то в результате выполнения на экран выведется следующая информация:
    Выполняется файл: primer.bat
    Файл запущен со следующими параметрами:
    A
    B
    C
    D
    Все.
    Рассмотрим теперь оператор
    IF
    в следующем виде:
    IF [/I] строка1 оператор_сравнения строка2 команда
    Синтаксис и значение операторов_сравнения представлены в
    (табл. 2).
    Таблица 2.
    Операторы сравнения в IF
    Оператор
    Значение
    EQL
    Равно
    NEQ
    Не равно
    LSS
    Меньше
    LEQ
    Меньше или равно
    GTR
    Больше
    GEQ
    Больше или равно
    Пример 4. использования операторов сравнения:
    @ECHO OFF
    CLS
    IF -%1 EQL –Вася ECHO Привет, Вася!
    IF -%1 NEQ –Вася ECHO Привет, но Вы не Вася!
    Ключ
    /I
    , если он указан, задает сравнение текстовых строк без
    учета регистра. Ключ
    /I
    можно также использовать и в форме строка1==строка2
    команды
    IF
    . Например, условие
    IF /I DOS==dos … будет истинным.
    1.1.12.2 Проверка существования заданного файла
    Второй способ использования команды
    IF
    — это проверка существования заданного файла. Синтаксис для этого случая имеет вид:

    40
    IF [NOT] EXIST файл команда1 [ELSE команда2]
    Условие считается истинным, если указанный файл существует.
    Кавычки для имени файла не требуются. Приведем пример командного файла, в котором с помощью такого варианта команды IF проверяется наличие файла, указанного в качестве параметра командной строки.
    @ECHO OFF
    IF -%1==- GOTO NoFileSpecified
    IF NOT EXIST %1 GOTO FileNotExist
    :: Вывод сообщения о найденном файле
    ECHO Файл '%1' найден.
    GOTO :EOF
    :NoFileSpecified
    :: Файл запущен без параметров
    ECHO В командной строке не указано имя файла.
    GOTO :EOF
    :FileNotExist
    :: Параметр командной строки задан, но файл не найден
    ECHO Файл '%1' не найден.
    1.1.12.3 Проверка наличия переменной среды
    Аналогично файлам команда
    IF
    позволяет проверить наличие в системе определенной переменной среды:
    IF DEFINED переменная команда1 [ELSE команда2]
    Здесь условие
    DEFINED
    применяется подобно условию
    EXISTS
    наличия заданного файла, но принимает в качестве аргумента имя переменной среды и возвращает истинное значение, если эта переменная определена. Например:
    @ECHO OFF
    CLS
    IF DEFINED MyVar GOTO :VarExists
    ECHO Переменная MyVar не определена
    GOTO :EOF
    :VarExists
    ECHO Переменная MyVar определена,
    ECHO ее значение равно %MyVar%
    1.1.12.4 Проверка кода завершения предыдущей команды
    Еще один способ использования команды
    IF
    — это проверка кода завершения (кода выхода) предыдущей команды. Синтаксис для
    IF
    в этом

    41 случае имеет следующий вид:
    IF [NOT] ERRORLEVEL число команда1 [ELSE команда2]
    Здесь условие считается истинным, если последняя запущенная команда или программа завершилась с кодом возврата, равным либо превышающим указанное число.
    Рассмотрим командный файл, который копирует файл my.txt на диск
    C: без вывода на экран сообщений о копировании, а в случае возникновения какой-либо ошибки выдает предупреждение:
    @ECHO OFF
    XCOPY my.txt C:\ > NUL
    :: Проверка кода завершения копирования
    IF ERRORLEVEL 1 GOTO ErrOccurred
    ECHO Копирование выполнено без ошибок.
    GOTO :EOF
    :ErrOccurred
    ECHO При выполнении команды XCOPY возникла ошибка!
    В операторе
    IF ERRORLEVEL …
    можно также применять операторы сравнения чисел, приведенные в табл. 2. Например:
    IF ERRORLEVEL LEQ 1 GOTO Case1
    1   2   3   4   5   6   7   8   9   ...   21


    написать администратору сайта