Язык командной строки виндовс
Язык интерпретатора Cmd.exe. Командные файлы
Язык интерпретатора Cmd.exe. Командные файлы
Язык оболочки командной строки ( shell language ) в Windows реализован в виде командных (или пакетных) файлов. Командный файл в Windows — это обычный текстовый файл с расширением bat или cmd, в котором записаны допустимые команды операционной системы (как внешние, так и внутренние), а также некоторые дополнительные инструкции и ключевые слова, придающие командным файлам некоторое сходство с алгоритмическими языками программирования. Например, если записать в файл deltmp.bat следующие команды:
Вывод сообщений и дублирование команд
По умолчанию команды пакетного файла перед исполнением выводятся на экран, что выглядит не очень эстетично. С помощью команды ECHO OFF можно отключить дублирование команд, идущих после нее (сама команда ECHO OFF при этом все же дублируется). Например,
Таким образом, если поставить в самое начало файла команду
то это решит все проблемы с дублированием команд.
В пакетном файле можно выводить на экран строки с сообщениями. Делается это с помощью команды
С помощью такого метода можно, скажем, заполнять файлы-протоколы с отчетом о произведенных действиях. Например:
Использование параметров командной строки
При запуске пакетных файлов в командной строке можно указывать произвольное число параметров, значения которых можно использовать внутри файла. Это позволяет, например, применять один и тот же командный файл для выполнения команд с различными параметрами.
Если запустить его из командной строки с двумя параметрами, например
то на экран выведется сообщение
и произойдет копирование каталога C:\Programs со всеми его подкаталогами в D:\Backup.
Рассмотрим пример. Пусть командный файл my.bat вызван из командной строки следующим образом:
Например, в следующей команде:
В командных файлах имеются некоторые возможности синтаксического анализа заменяемых параметров. Для параметра с номером n (%n) допустимы синтаксические конструкции (операторы), представленные в табл. 3.1.
Fn
Dn
Pn
Nn
Xn
Sn
Данные синтаксические конструкции можно объединять друг с другом, например:
DPn — из переменной %n выделяется имя диска и путь,
NXn — из переменной %n выделяется имя файла и расширение.
Рассмотрим следующий пример. Пусть мы находимся в каталоге C:\TEXT и запускаем пакетный файл с параметром Рассказ.doc ( %1=Рассказ.doc ). Тогда применение операторов, описанных в табл. 3.1, к параметру %1 даст следующие результаты:
Основы командной строки Windows
В данной статье будут рассмотрены основы командной строки Windows, а именно:
Понятие командной строки
Поддержка командной строки встроена в операционную систему Microsoft Windows и доступна через окно командной оболочки. Командная строка поддерживается во всех версиях Windows и служит для запуска встроенных команд, утилит и сценариев. Несмотря на мощь и гибкость командной строки, некоторые администраторы Windows никогда ее не используют. Если вам хватает графических средств администрирования, можно применять только их, щелкая мышью элементы пользовательского интерфейса.
Однако опытные администраторы Windows, квалифицированные специалисты по технической поддержке и «продвинутые» пользователи не могут обойтись без командной строки. Зная, как правильно применять командную строку, в частности, какие средства командной строки выбрать, как и когда их использовать, чтобы они работали эффективно, можно избежать многочисленных проблем и добиться четкого выполнения операций. Если вы занимаетесь поддержкой нескольких доменов или сетей, то для автоматизации ежедневных операций не только важно, но и необходимо иметь представление об экономящих время способах работы с командной строкой.
С каждой новой версией Windows командная строка совершенствовалась, а ее возможности расширялись. Командная строка претерпела значительные изменения, связанные не только с повышением производительности, но и с увеличением гибкости. Теперь с помощью командной строки Windows можно решать задачи, которые нельзя было решить в предыдущих версиях Windows.
Среду командной оболочки Windows запускают разными способами, в частности указывая параметры при запуске Cmd.exe или используя собственный стартовый файл, хранящийся в каталоге %SystemRoot%\System32.
Кроме того, командная строка может работать в пакетном режиме для выполнения набора команд. В пакетном режиме командная строка считывает и выполняет команды одну за другой.
Работая с командной строкой Windows, Вы должны понимать, откуда берутся используемые Вами команды. «Родные» команды (встроенные в операционную систему) бывают двух видов:
Краткий справочник по командам командной оболочки (Cmd.exe)
Синтаксис любой внутренней команды (и большинства внешних) можно получить, введя в командной строке имя команды и /?, например:
Командная оболочка — весьма мощная среда работы с командами и сценариями. В командной строке можно запускать команды разных типов: встроенные команды, утилиты Windows и версии приложений, рассчитанные на командную строку. Независимо от типа каждая команда, которую вы будете использовать, должна соответствовать одним и тем же синтаксическим правилам. Согласно этим правилам, за именем команды идут обязательные или необязательные аргументы. Кроме того, аргументы могут использовать перенаправление ввода, вывода или стандартных ошибок.
Последовательность событий при выполнение команды
При работе с командной оболочкой Вы, вероятно, запускали ее, открывая меню Start (Пуск) и выбирая Programs (Программы) или All Programs (Все программы), затем Accessories (Стандартные) и Command Prompt (Командная строка). Другие способы запуска командной строки — диалоговое окно Run (Запуск программы) или ввод cmd в другом, уже открытом окне командной оболочки. Эти способы позволяют при запуске командной строки указывать аргументы: ключи, управляющие работой командной строки, и параметры, инициирующие выполнение дополнительных команд. Например, можно запустить командную оболочку в «молчаливом» режиме (т. е. отключить эхо-вывод) командой cmd /q или сделать так, чтобы командная оболочка выполнила заданную команду и завершила свою работу, — для этого нужно ввести cmd /с, а затем текст команды в кавычках.
В следующем примере командная оболочка запускается, выполняет команду ipconfig с выводом результатов в файл и завершается:
Создание сценариев командной строки
Сценарии командной строки — текстовые файлы с командами, которые вы хотите выполнить. Это те же команды, которые обычно вводятся в командной оболочке Windows. Однако вместо того чтобы вводить команды каждый раз, когда они понадобятся, можно создать соответствующий сценарий и упростить себе жизнь.
Управление отображением текста и команд
Команда ECHO служит двум целям: для записи текста в вывод (например, в окно командной оболочки или текстовый файл) и для включения/выключения эхо-отображения команд. Обычно при выполнении команд сценария сами команды и вывод этих команд отображаются в консольном окне. Это называется эхо-отображением команд (comand echoing).
Чтобы использовать команду ECHO для отображения текста, введите echo и текст, который надо вывести:
Чтобы с помощью ECHO управлять эхо-отображением команд, введите echo off или echo on, например:
Чтобы направить вывод в файл, а не в окно командной оболочки, используйте перенаправление вывода, например:
Теперь посмотрим, как подавляется эхо-отображение команд. Запустите командную оболочку, введите echo off, затем другие команды. Вы увидите, что приглашение командной строки больше не выводится. Вместо него появляется только то, что набирается в консольном окне, и вывод выполненных команд. В сценариях команда ECHO OFF отключает эхо-отображение команд и приглашение командной строки. Добавляя в свои сценарии команду ECHO OFF, вы предотвращаете загромождение окна командной оболочки или файла текстом команд, если Вас интересует лишь вывод от этих команд.
Изучение системной информации
Часто при работе с компьютером пользователя или удаленным сервером возникает необходимость в получении базовой информации о системе вроде имени зарегистрированного в ней пользователя, текущего системного времени или местоположения определенного файла. Команды, которые позволяют собрать основную информацию о системе, включают:
Чтобы использовать NOW или WHOAMI, просто введите команду в окне командной оболочки и нажмите Enter. Наиболее распространенный синтаксис для WHERE выглядит так:
Также можно найти файлы всех типов, имена которых начинаются с data:
Иногда нужно получить информацию о конфигурации системы или о системном окружении. В критически важных системах эту информацию можно сохранить или распечатать для справки. Ниже перечислены команды, позволяющие собирать информацию о системе.
Чтобы использовать эти команды на локальном компьютере, просто введите имя нужной команды в окне командной оболочки и нажмите Enter.
Команды для использования реестра
Реестр Windows хранит конфигурационную информацию операционной системы, приложений, пользователей и оборудования. Эти данные содержатся в разделах (keys) и параметрах (values) реестра, которые размещаются в определенном корневом разделе (root key), который контролирует, как и когда используются разделы и параметры.
Если Вы знаете пути к разделам и понимаете допустимые типы данных в разделах, то можете использовать команду REG для просмотра разделов и параметров и манипуляций над ними самыми разнообразными способами. REG поддерживает несколько подкоманд:
Управление системными службами
Службы обеспечивают ключевые функции рабочих станций и серверов. Для управления системными службами на локальных и удаленных системах используется команда контроллера служб (service controller command) SC, имеющая набор подкоманд, ниже описывается лишь их часть:
Во всех командах можно указывать имя удаленного компьютера, со службами которого Вы хотите работать. Для этого вставьте UNC-имя или IP-адрес компьютера перед используемой подкомандой. Вот синтаксис:
Перезагрузка и выключение систем из командной строки
Системы нередко приходится перезагружать или выключать. Один из способов — использовать для этого утилиту Shutdown, которая позволяет работать с локальной и удаленными системами. Другой способ управлять выключением или перезагрузкой системы — назначить задание для выключения. Здесь можно использовать Schtasks, чтобы указать время выключения, или создать сценарий со списком команд выключения для индивидуальных систем.
Управлять перезагрузкой и выключением локальной системы позволяют следующие команды.
Выключение локальной системы:
Перезагрузка локальной системы:
Управление приложениями, процессами и производительностью
Всякий раз, когда операционная система или пользователь запускает службу, приложение или команду, Microsoft Windows запускает один или более процессов для управления соответствующей программой. Несколько утилит командной строки упростят вам мониторинг программ и управление ими. К этим утилитам относятся:
Вот в принципе все, что я хотел рассказать об основах командной строки Windows.
Теоретический материал. Язык оболочки командной строки (shell language) в Windows реализован в виде командных (или
Язык оболочки командной строки (shell language) в Windows реализован в виде командных (или пакетных) файлов. Командный файл в Windows ‑ это обычный текстовый файл с расширением bat или cmd, в котором записаны допустимые команды операционной системы (как внешние, так и внутренние), а также некоторые дополнительные инструкции и ключевые слова, придающие командным файлам некоторое сходство с алгоритмическими языками программирования. Например, если записать в файл deltmp.bat следующие команды:
и запустить его на выполнение (аналогично исполняемым файлам с расширением com или exe), то мы удалим все файлы во временной директории Windows. Таким образом, исполнение командного файла приводит к тому же результату, что и последовательный ввод записанных в нем команд. При этом не проводится никакой предварительной компиляции или проверки синтаксиса кода; если встречается строка с ошибочной командой, то она игнорируется. Очевидно, что если вам приходится часто выполнять одни и те же действия, то использование командных файлов может сэкономить много времени.
Вывод сообщений и дублирование команд
По умолчанию команды пакетного файла перед исполнением выводятся на экран, что выглядит не очень эстетично. С помощью команды ECHO OFF можно отключить дублирование команд, идущих после нее (сама команда ECHO OFF при этом все же дублируется). Например,
REM Следующие две команды будут дублироваться на экране …
REM А остальные уже не будут
Для восстановления режима дублирования используется команда ECHO ON. Кроме этого, можно отключить дублирование любой отдельной строки в командном файле, написав в начале этой строки символ @, например:
REM Команда DIR C:\ дублируется на экране
REM А команда DIR D:\ — нет
Таким образом, если поставить в самое начало файла команду
то это решит все проблемы с дублированием команд.
В пакетном файле можно выводить на экран строки с сообщениями. Делается это с помощью команды
Команда ECHO. (точка должна следовать
непосредственно за словом «ECHO»)
выводит на экран пустую строку. Например,
Часто бывает удобно для просмотра сообщений, выводимых из пакетного файла, предварительно полностью очистить экран командой CLS.
Используя механизм перенаправления ввода/вывода (символы > и >>), можно направить сообщения, выводимые командой ECHO, в определенный текстовый файл. Например:
ECHO Привет! > hi.txt
С помощью такого метода можно, скажем, заполнять файлы-протоколы с отчетом о произведенных действиях. Например:
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 Файл %0 копирует каталог %1 в %2
Если запустить его из командной строки с двумя параметрами, например
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 вызван из командной строки следующим образом:
Тогда %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.
Например, в следующей команде:
параметр %2 заменяется на %3, %3 на %4 и т.д., а параметры %0 и %1 остаются без изменений.
Команда, обратная SHIFT (обратный сдвиг), отсутствует. После выполнения SHIFT уже нельзя восстановить параметр (%0), который был первым перед сдвигом. Если в командной строке задано больше десяти параметров, то команду SHIFT можно использовать несколько раз.
В командных файлах имеются некоторые возможности синтаксического анализа заменяемых параметров. Для параметра с номером n (%n) допустимы синтаксические конструкции (операторы), представленные в таблице 1.
Таблица 1. Операторы для заменяемых параметров
Fn
Dn
Pn
Nn
Xn
Sn
$PATH:n
Данные синтаксические конструкции можно объединять друг с другом, например:
DPn ‑ из переменной %n выделяется имя диска и путь,
NXn ‑ из переменной %n выделяется имя файла и расширение.
Рассмотрим следующий пример. Пусть мы находимся в каталоге C:\TEXT и запускаем пакетный файл с параметром Рассказ.doc (%1=Рассказ.doc). Тогда применение операторов, описанных в таблице 1, к параметру %1 даст следующие результаты:
Работа с переменными среды
Внутри командных файлов можно работать с так называемыми переменными среды (или переменными окружения), каждая из которых хранится в оперативной памяти, имеет свое уникальное имя, а ее значением является строка. Стандартные переменные среды автоматически инициализируются в процессе загрузки операционной системы. Такими переменными являются, например, WINDIR, которая определяет расположение каталога Windows, TEMP, которая определяет путь к каталогу для хранения временных файлов Windows или PATH, в которой хранится системный путь (путь поиска), то есть список каталогов, в которых система должна искать выполняемые файлы или файлы совместного доступа (например, динамические библиотеки). Кроме того, в командных файлах с помощью команды SET можно объявлять собственные переменные среды.
Получение значения переменной
Для получения значения определенной переменной среды нужно имя этой переменной заключить в символы %. Например:
REM Создание переменной MyVar
REM Изменение переменной
ECHO Значение переменной MyVar: %MyVar%
REM Удаление переменной MyVar
ECHO Значение переменной WinDir: %WinDir%
При запуске такого командного файла на экран выведется строка
Значение переменной MyVar: Привет!
Значение переменной WinDir: C:\WINDOWS
Преобразования переменных как строк
С переменными среды в командных файлах можно производить некоторые манипуляции. Во-первых, над ними можно производить операцию конкатенации (склеивания). Для этого нужно в команде SET просто написать рядом значения соединяемых переменных. Например,
После выполнения в файле этих команд значением переменной C будет являться строка ‘РазДва‘. Не следует для конкатенации использовать знак +, так как он будет воспринят просто в качестве символа. Например, после запуска файл следующего содержания
ECHO Переменная C=%C%
ECHO Переменная D=%D%
на экран выведутся две строки:
Во-вторых, из переменной среды можно выделять подстроки с помощью конструкции %имя_переменной:
n1,n2%, где число n1 определяет смещение (количество пропускаемых символов) от начала (если n1 положительно) или от конца (если n1 отрицательно) соответствующей переменной среды, а число n2 ‑ количество выделяемых символов (если n2 положительно) или количество последних символов в переменной, которые не войдут в выделяемую подстроку (если n2 отрицательно). Если указан только один отрицательный параметр -n, то будут извлечены последние n символов. Например, если в переменной хранится строка «21.09.2007» (символьное представление текущая дата при определенных региональных настройках), то после выполнения следующих команд
новые переменные будут иметь такие значения: %dd1%=21, %dd2%=21, %mm%=09, %yyyy%=2007.
В-третьих, можно выполнять процедуру замены подстрок с помощью конструкции %имя_переменной:s1=s2% (в результате будет возвращена строка, в которой каждое вхождение подстроки s1 в соответствующей переменной среды заменено на s2). Например, после выполнения команд
в переменной b будет храниться строка «199456». Если параметр s2 не указан, то подстрока s1 будет удалена из выводимой строки, т.е. после выполнения команды
в переменной b будет храниться строка «1456».
Операции с переменными как с числами
При включенной расширенной обработке команд (этот режим в Windows XP используется по умолчанию) имеется возможность рассматривать значения переменных среды как числа и производить с ними арифметические вычисления. Для этого используется команда SET с ключом /A. Приведем пример пакетного файла add.bat, складывающего два числа, заданных в качестве параметров командной строки, и выводящего полученную сумму на экран:
REM В переменной M будет храниться сумма
ECHO Сумма %1 и %2 равна %M%
REM Удалим переменную M
Локальные изменения переменных
Все изменения, производимые с помощью команды SET над переменными среды в командном файле, сохраняются и после завершения работы этого файла, но действуют только внутри текущего командного окна. Также имеется возможность локализовать изменения переменных среды внутри пакетного файла, то есть автоматически восстанавливать значения всех переменных в том виде, в каком они были до начала запуска этого файла. Для этого используются две команды: SETLOCAL и ENDLOCAL. Команда SETLOCAL определяет начало области локальных установок переменных среды. Другими словами, изменения среды, внесенные после выполнения SETLOCAL, будут являться локальными относительно текущего пакетного файла. Каждая команда SETLOCAL должна иметь соответствующую команду ENDLOCAL для восстановления прежних значений переменных среды. Изменения среды, внесенные после выполнения команды ENDLOCAL, уже не являются локальными относительно текущего пакетного файла; их прежние значения не будут восстановлены по завершении выполнения этого файла.
Связывание времени выполнения для переменных
При работе с составными выражениями (группы команд, заключенных в круглые скобки) нужно учитывать, что переменные среды в командных файлах используются в режиме раннего связывания. С точки зрения логики выполнения командного файла это может привести к ошибкам. Например, рассмотрим командный файл 1.bat со следующим содержимым:
и командный файл 2.bat:
Казалось бы, результат выполнения этих двух файлов должен быть одинаковым: на экран выведутся две строки: «a=1» и «a=2». На самом же деле таким образом сработает только файл 1.bat, а файл 2.bat два раза выведет строку «a=1»!
Данную ошибку можно обойти, если для получения значения переменной вместо знаков процента (%) использовать восклицательный знак (!) и предварительно включить режим связывания времени выполнения командой SETLOCAL ENABLEDELAYEDEXPANSION. Таким образом, для корректной работы файл 2.bat должен иметь следующий вид:
Приостановка выполнения командных файлов
ECHO Вставьте дискету в дисковод A: и нажмите любую клавишу
Команду PAUSE обязательно нужно использовать при выполнении потенциально опасных действий (удаление файлов, форматирование дисков и т.п.). Например,
ECHO Сейчас будут удалены все файлы в C:\Мои документы!
ECHO Для отмены нажмите Ctrl-C
DEL «C:\Мои документы\*.*»
Вызов внешних командных файлов
Из одного командного файла можно вызвать другой, просто указав его имя. Например:
REM Вывод списка log-файлов
REM Передача выполнения файлу f.bat
Однако в этом случае после выполнения вызванного файла управление в вызывающий файл не передается, то есть в приведенном примере команда
(и все следующие за ней команды) никогда не будет выполнена.
Для того, чтобы вызвать внешний командный файл с последующим возвратом в первоначальный файл, нужно использовать специальную команду
REM Вывод списка log-файлов
REM Передача выполнения файлу f.bat
В этом случае после завершения работы файла f.bat управление вернется в первоначальный файл на строку, следующую за командой CALL (в нашем примере это команда COPY A:\*.* C:\).
Командный файл может содержать метки и команды GOTO перехода к этим меткам. Любая строка, начинающаяся с двоеточия :, воспринимается при обработке командного файла как метка. Имя метки задается набором символов, следующих за двоеточием до первого пробела или конца строки. Приведем пример.
Пусть имеется командный файл следующего содержания:
ECHO Эта строка никогда не выполнится
REM Продолжение выполнения
После того, как в этом файле мы доходим до команды
его выполнение продолжается со строки
REM Продолжение выполнения
В команде перехода внутри файла GOTO можно задавать в качестве метки перехода строку :EOF, которая передает управление в конец текущего пакетного файла (это позволяет легко выйти из пакетного файла без определения каких-либо меток в самом его конце).
Также для перехода к метке внутри текущего командного файла кроме команды GOTO можно использовать и рассмотренную выше команду CALL:
CALL :метка аргументы
При вызове такой команды создается новый контекст текущего пакетного файла с заданными аргументами, и управление передается на инструкцию, расположенную сразу после метки. Для выхода из такого пакетного файла необходимо два раза достичь его конца. Первый выход возвращает управление на инструкцию, расположенную сразу после строки CALL, а второй выход завершает выполнение пакетного файла. Например, если запустить с параметром «Копия-1» командный файл следующего содержания:
то на экран выведутся три строки:
Таким образом, подобное использование команды CALL очень похоже на обычный вызов подпрограмм (процедур) в алгоритмических языках программирования.
С помощью команды IF … ELSE (ключевое слово ELSE может отсутствовать) в пакетных файлах можно выполнять обработку условий нескольких типов. При этом если заданное после IF условие принимает истинное значение, система выполняет следующую за условием команду (или несколько команд, заключенных в круглые скобки), в противном случае выполняется команда (или несколько команд в скобках), следующие за ключевым словом ELSE.
Проверка значения переменной
Первый тип условия используется обычно для проверки значения переменной. Для этого применяются два варианта синтаксиса команды IF:
IF [NOT] строка1==строка2 команда1 [ELSE команда2]
(квадратные скобки указывают на необязательность заключенных в них параметров) или
IF [/I] [NOT] строка1 оператор_сравнения строка2 команда
Рассмотрим сначала первый вариант. Условие строка1==строка2 (здесь необходимо писать именно два знака равенства) считается истинным при точном совпадении обеих строк. Параметр NOT указывает на то, что заданная команда выполняется лишь в том случае, когда сравниваемые строки не совпадают.
Строки могут быть литеральными или представлять собой значения переменных (например, %1 или %TEMP%). Кавычки для литеральных строк не требуются. Например,
IF %1==%2 ECHO Параметры совпадают!
IF %1==Петя ECHO Привет, Петя!
Отметим, что при сравнении строк, заданных переменными, следует проявлять определенную осторожность. Дело в том, что значение переменной может оказаться пустой строкой, и тогда может возникнуть ситуация, при которой выполнение командного файла аварийно завершится. Например, если вы не определили с помощью команды SET переменную MyVar, а в файле имеется условный оператор типа
IF %MyVar%==C:\ ECHO Ура.
то в процессе выполнения вместо %MyVar% подставится пустая строка и возникнет синтаксическая ошибка. Такая же ситуация может возникнуть, если одна из сравниваемых строк является значением параметра командной строки, так как этот параметр может быть не указан при запуске командного файла. Поэтому при сравнении строк нужно приписывать к ним в начале какой-нибудь символ, например:
С помощью команд IF и SHIFT можно в цикле обрабатывать все параметры командной строки файла, даже не зная заранее их количества. Например, следующий командный файл (назовем его primer.bat) выводит на экран имя запускаемого файла и все параметры командной строки:
ECHO Выполняется файл: %0
ECHO Файл запущен со следующими параметрами.
REM Сдвиг параметров
REM Переход на начало цикла
REM Выход из цикла
Если запустить primer.bat с четырьмя параметрами:
то в результате выполнения на экран выведется следующая информация:
Выполняется файл: primer.bat
Файл запущен со следующими параметрами:
Рассмотрим теперь оператор IF в следующем виде:
IF [/I] строка1 оператор_сравнения строка2 команда
Синтаксис и значение операторов_сравнения представлены в таблице 2.
Таблица 2. Операторы сравнения в IF
Параметр | Значение |
EQL | Равно |
NEQ | Не равно |
LSS | Меньше |
LEQ | Меньше или равно |
GTR | Больше |
GEQ | Больше или равно |
Приведем пример использования операторов сравнения:
Ключ /I, если он указан, задает сравнение текстовых строк без учета регистра. Ключ /I можно также использовать и в форме строка1==строка2 команды IF. Например, условие
Проверка существования заданного файла
Второй способ использования команды IF ‑ это проверка существования заданного файла. Синтаксис для этого случая имеет вид:
IF [NOT] EXIST файл команда1 [ELSE команда2]
Условие считается истинным, если указанный файл существует. Кавычки для имени файла не требуются. Приведем пример командного файла, в котором с помощью такого варианта команды IF проверяется наличие файла, указанного в качестве параметра командной строки.
IF NOT EXIST %1 GOTO FileNotExist
REM Вывод сообщения о найденном файле
ECHO Файл ‘%1’ успешно найден.
REM Файл запущен без параметров
ECHO В командной строке не указано имя файла.
REM Параметр командной строки задан, но файл не найден
ECHO Файл ‘%1’ не найден.
Проверка наличия переменной среды
Аналогично файлам команда IF позволяет проверить наличие в системе определенной переменной среды:
IF DEFINED переменная команда1 [ELSE команда2]
Здесь условие DEFINED применяется подобно условию EXISTS наличия заданного файла, но принимает в качестве аргумента имя переменной среды и возвращает истинное значение, если эта переменная определена. Например:
IF DEFINED MyVar GOTO :VarExists
ECHO Переменная MyVarне определена
ECHO Переменная MyVarопределена,
ECHO ее значение равно %MyVar%
Проверка кода завершения предыдущей команды
Еще один способ использования команды IF ‑ это проверка кода завершения (кода выхода) предыдущей команды. Синтаксис для IF в этом случае имеет следующий вид:
IF [NOT] ERRORLEVEL число команда1 [ELSE команда2]
Здесь условие считается истинным, если последняя запущенная команда или программа завершилась с кодом возврата, равным либо превышающим указанное число.
Составим, например, командный файл, который бы копировал файл my.txt на диск C: без вывода на экран сообщений о копировании, а в случае возникновения какой-либо ошибки выдавал предупреждение:
XCOPY my.txt C:\ > NUL
REM Проверка кода завершения копирования
IF ERRORLEVEL 1 GOTO ErrOccurred
ECHO Копирование выполнено без ошибок.
ECHO При выполнении команды XCOPY возникла ошибка!
В операторе IF ERRORLEVEL … можно также применять операторы сравнения чисел, приведенные в таблице 2. Например:
IF ERRORLEVEL LEQ 1 GOTO Case1
Примечание: Иногда более удобным для работы с кодами завершения программ может оказаться использование переменной %ERRORLEVEL%. (строковое представление текущего значения кода ошибки ERRORLEVEL).
Проверка версии реализации расширенной обработки команд
Наконец, для определения внутреннего номера версии текущей реализации расширенной обработки команд применяется оператор IF в следующем виде:
IF CMDEXTVERSION число команда1 [ELSE команда2]
Здесь условие CMDEXTVERSION применяется подобно условию ERRORLEVEL, но число сравнивается с вышеупомянутым внутренним номером версии. Первая версия имеет номер 1. Номер версии будет увеличиваться на единицу при каждом добавлении существенных возможностей расширенной обработки команд. Если расширенная обработка команд отключена, условие CMDEXTVERSION никогда не бывает истинно.
В командных файлах для организации циклов используются несколько разновидностей оператора FOR, которые обеспечивают следующие функции:
· выполнение заданной команды для всех элементов указанного множества;
· выполнение заданной команды для всех подходящих имен файлов;
· выполнение заданной команды для всех подходящих имен каталогов;
· выполнение заданной команды для определенного каталога, а также всех его подкаталогов;
· получение последовательности чисел с заданными началом, концом и шагом приращения;
· чтение и обработка строк из текстового файла;
· обработка строк вывода определенной команды.
Самый простой вариант синтаксиса команды FOR для командных файлов имеет следующий вид:
FOR %%переменная IN (множество)
DO команда [параметры]
Внимание: Перед названием переменной должны стоять именно два знака процента (%%), а не один, как это было при использовании команды FOR непосредственно из командной строки.
Сразу приведем пример. Если в командном файле заданы строки
FOR %%i IN (Раз,Два,Три) DO ECHO %%i
то в результате его выполнения на экране будет напечатано следующее:
Параметр множество в команде FOR задает одну или более текстовых строк, разделенных запятыми, которые вы хотите обработать с помощью заданной команды. Скобки здесь обязательны. Параметр команда [параметры] задает команду, выполняемую для каждого элемента множества, при этом вложенность команд FOR на одной строке не допускается. Если в строке, входящей во множество, используется запятая, то значение этой строки нужно заключить в кавычки. Например, в результате выполнения файла с командами
FOR %%i IN («Раз,Два»,Три) DO ECHO %%i
на экран будет выведено
Параметр %%переменная представляет подставляемую переменную (счетчик цикла), причем здесь могут использоваться только имена переменных, состоящие из одной буквы. При выполнении команда FOR заменяет подставляемую переменную текстом каждой строки в заданном множестве, пока команда, стоящая после ключевого слова DO, не обработает все такие строки.
Замечание: Чтобы избежать путаницы с параметрами командного файла %0 ‑ %9, для переменных следует использовать любые символы кроме 0 ‑ 9.
Параметр множество в команде FOR может также представлять одну или несколько групп файлов. Например, чтобы вывести в файл список всех файлов с расширениями txt и prn, находящихся в каталоге C:\TEXT, без использования команды DIR, можно использовать командный файл следующего содержания:
FOR %%f IN (C:\TEXT\*.txt C:\TEXT\*.prn) DO ECHO %%f >> list.txt
При таком использовании команды FOR процесс обработки продолжается, пока не обработаются все файлы (или группы файлов), указанные во множестве.
Цикл FOR /D … IN … DO …
Следующий вариант команды FOR реализуется с помощью ключа /D:
FOR /D %переменная IN (набор) DO команда [параметры]
В случае, если набор содержит подстановочные знаки, то команда выполняется для всех подходящих имен каталогов, а не имен файлов. Скажем, выполнив следующий командный файл:
FOR /D %%f IN (C:\*.*) DO ECHO %%f
мы получим список всех каталогов на диске C:, например:
Цикл FOR /R … IN … DO …
С помощью ключа /R можно задать рекурсию в команде: FOR:
FOR /R [[диск:]путь] %переменная IN (набор)
DO команда [параметры]
В этом случае заданная команда выполняется для каталога [диск:]путь, а также для всех подкаталогов этого пути. Если после ключа R не указано имя каталога, то выполнение команды начинается с текущего каталога. Например, для распечатки всех файлов с расширением txt в текущем каталоге и всех его подкаталогах можно использовать следующий пакетный файл:
FOR /R %%f IN (*.txt) DO PRINT %%f
Если вместо набора указана только точка (.), то команда проверяет все подкаталоги текущего каталога. Например, если мы находимся в каталоге C:\TEXT с двумя подкаталогами BOOKS и ARTICLES, то в результате выполнения файла:
FOR /R %%f IN (.) DO ECHO %%f
на экран выведутся три строки:
Цикл FOR /L … IN … DO …
Ключ /L позволяет реализовать с помощью команды FOR арифметический цикл, в этом случае синтаксис имеет следующий: вид:
FOR /L %переменная IN (начало,шаг,конец) DO команда [параметры]
Здесь заданная после ключевого слова IN тройка (начало,шаг,конец) раскрывается в последовательность чисел с заданными началом, концом и шагом приращения. Так, набор (1,1,5) раскрывается в (1 2 3 4 5), а набор (5,-1,1) заменяется на (5 4 3 2 1). Например, в результате выполнения следующего командного файла:
FOR /L %%f IN (1,1,5) DO ECHO %%f
переменная цикла %%f пробежит значения от 1 до 5, и на экране напечатаются пять чисел:
Числа, получаемые в результате выполнения цикла FOR /L, можно использовать в арифметических вычислениях. Рассмотрим командный файл my.bat следующего содержания:
FOR /L %%f IN (1,1,5) DO CALL :2 %%f
В третьей строке в цикле происходит вызов нового контекста файла my.bat с текущим значением переменной цикла %%f в качестве параметра командной строки, причем управление передается на метку :2 (см. описание CALL в разделе «Изменения в командах перехода»). В шестой строке переменная цикла умножается на десять, и результат записывается в переменную M. Таким образом, в результате выполнения этого файла выведется следующая информация:
Цикл FOR /F … IN … DO …
Самые мощные возможности (и одновременно самый запутанный синтаксис) имеет команда: FOR с ключом /F:
FOR /F [«ключи»] %переменная IN (набор)
DO команда [параметры]
Здесь параметр набор содержит имена одного или нескольких файлов, которые по очереди открываются, читаются и обрабатываются. Обработка состоит в чтении файла, разбиении его на отдельные строки текста и выделении из каждой строки заданного числа подстрок. Затем найденная подстрока используется в качестве значения переменной при выполнении основного тела цикла (заданной команды).
По умолчанию ключ /F выделяет из каждой строки файла первое слово, очищенное от окружающих его пробелов. Пустые строки в файле пропускаются. Необязательный параметр «ключи» служит для переопределения заданных по умолчанию правил обработки строк. Ключи представляют собой заключенную в кавычки строку, содержащую приведенные в таблице 3 ключевые слова:
Таблица 3. Ключи в команде FOR /F
Ключ | Описание |
EOL=C | Определение символа комментариев в начале строки (допускается задание только одного символа) |
SKIP=N | Число пропускаемых при обработке строк в начале файла |
DELIMS=XXX | Определение набора разделителей для замены заданных по умолчанию пробела и знака табуляции |
TOKENS=X,Y,M-N | Определение номеров подстрок, выделяемых из каждой строки файла и передаваемых для выполнения в тело цикла |
При использовании ключа TOKENS=X,Y,M-N создаются дополнительные переменные. Формат M-N представляет собой диапазон подстрок с номерами от M до N. Если последний символ в строке TOKENS= является звездочкой, то создается дополнительная переменная, значением которой будет весь текст, оставшийся в строке после обработки последней подстроки.
Разберем применение этой команды на примере пакетного файла parser.bat, который производит разбор файла myfile.txt:
IF NOT EXIST myfile.txt GOTO :NoFile
FOR /F «EOL=; TOKENS=2,3* DELIMS=, » %%i IN
(myfile.txt) DO @ECHO %%i %%j %%k
ECHO Не найден файл myfile.txt!
Здесь во второй строке производится проверка наличия файла myfile.txt; в случае отсутствия этого файла выводится предупреждающее сообщение. Команда FOR в третьей строке обрабатывает файл myfile.txt следующим образом:
Пропускаются все строки, которые начинаются с символа точки с запятой (EOL=;).
Вторая и третья подстроки из каждой строки передаются в тело цикла, причем подстроки разделяются пробелами (по умолчанию) и/или запятыми (DELIMS=,).
В теле цикла переменная %%i используется для второй подстроки, %%j ‑ для третьей, а %%k получает все оставшиеся подстроки после третьей.
В нашем примере переменная %%i явно описана в инструкции FOR, а переменные %%j и %%k описываются неявно с помощью ключа TOKENS=. Например, если в файле myfile.txt были записаны следующие три строки:
ААА ББББ ВВВВ,ГГГГГ ДДДД
то в результате выполнения пакетного файла parser.bat на экран выведется следующее:
ББББ ВВВВ ГГГГГ ДДДД
Замечание: Ключ TOKENS= позволяет извлечь из одной строки файла до 26 подстрок, поэтому запрещено использовать имена переменных, начинающиеся не с букв английского алфавита (a–z). Следует помнить, что имена переменных FOR являются глобальными, поэтому одновременно не может быть активно более 26 переменных.