Далее кратко описаны полезные возможности, которые можно использовать в командных файлах (*.bat;*.cmd aka батники) операционных систем Windows 2000, XP, 2003 и более поздних.
В этих операционных системах введены существенные расширения возможностей сценариев командной строки, которые позволяют делать, например, следующие вещи:
- определение для файла полного и короткого пути к нему, имени, расширения, размера, времени модификации
- выборочная итерация по файлам и каталогам с применением различных команд
- расширенное перенаправление потоков ввода/вывода
- использование переменных, вычисление арифметических выражений, манипуляции со подстроками
- расширенная обработка условий
- . многое другое
Более подробную помощь нежели в данном обзоре можно найти в стандартной справке в каталоге Windows.
(Типичный путь к файлу справки: C:WINDOWSHelp
tcmds.chm. Если Windows установлена в каталог, отличный от C:WINDOWS, то ссылки на справку из данной страницы работать не будут. Потребуется открыть справку самостоятельно.)
В частности, крайне полезно почитать следующие разделы:
Справку по конкретной команде также всегда можно получить набрав в командной строке " /?".
Например, очень познавательно почитать то, что выдается в результате команд set /?, call /?, for /?, if /?.
Помощь приводится на языке установленной операционной системы.
Содержание
- Вывод
- Текущий каталог
- Параметры вызова сценариев
- Проверка условий
- Использование меток
- Запуск команд
- Код возврата команд
- Копирование
- Использование нескольких команд и символов условной обработки
- Использование переменных среды
- Вычисление арифметических выражений
- Потоки ввода/вывода
- Организация циклов
- Итерация и разбор файлов
- Организация блокировок
- Установка цвета консоли
- Локальные переменные среды
- Список переменных сред
- Рекомендуем к прочтению
Вывод
Текущий каталог
Параметры вызова сценариев
Например, после вызова будем иметь следующую картину:
| Параметр | Значение |
|---|---|
| %0 | d:deltalngscompile_all.cmd |
| %1 | sol.dpr |
| %2 | . (точка) |
| %3,%4,%5 и т.д. | (пусты) |
| %* | sol.dpr . |
Современные ОС используют расширенный режим обработки параметров, в котором доступны следующие модификаторы:
| Модификатор | Описание |
|---|---|
| расширение %1 и удаление любых кавычек ("") | |
| замена %1 полным путем | |
| замена %1 именем диска | |
| замена %1 путем без диска и имени файла | |
| замена %1 именем файла без расширения | |
| замена %1 расширением имени файла | |
| замена полным путем, содержащим только короткие имена | |
| замена %1 атрибутами файла | |
| замена %1 датой и временем модификации файла | |
| замена %1 размером файла | |
| Поиск в каталогах, перечисленных в переменной среды PATH, замена %1 полным именем первого найденного файла. Если переменная среды не определена или поиск не обнаружил файлов, модификатор выдает пустую строку. |
Описанные модификаторы можно применять в различных сочетаниях для всех параметров. Например:
| Модификатор | Описание |
|---|---|
| полный путь (включая завершающий слэш) к каталогу выполняемого скрипта | |
| имя файла первого параметра с расширением | |
| размер файла второго параметра | |
| замена %1 строкой, аналогичной результату работы программы dir |
Проверка условий
Проверка существования файла:
if [not] exist имя_файла команда [else выражение]
Например: if exist $result$.txt del $result$.txt
Проверка кода возврата:
if [not] errorlevel число команда [else выражение]
Условие верно, если предыдущая обработанная команда завершилась с кодом, равным или большим значения число.
Например:
Использование меток
Есть также особый вариант команды call для повторного вызова текущего скрипта с заданной метки с определенными параметрами.
Запуск команд
Инструкция "cmd команда" запускает системный пакетный обработчик cmd.exe для выполнения команды команда.
Если вызов происходит из консоли, то используется имеющаяся, если нет — создается новая.
Ключи /c и /k указывают, что по завершении исполнения консоль нужно закрыть или оставить, соответственно.
Инструкция "start команда" запускает обработку команды команда в отдельном параллельном процессе.
Соответствующие ключи позволяют изменять приоритет запускаемого процесса.
Ключ /wait указывает, что запустившему процессу следует дождаться завершения запущенного.
Запускать новые командные сценарии из командных сценариев можно также двумя способами.
Первый: Второй:
Код возврата команд
Команда exit число прерывает исполнение текущего сценария с возвратом запустившему его процессу заданного кода выхода. По умолчанию производится прерывание сразу всей цепочки вызовов пакетных сценариев. Если необходимо завершить только текущий сценарий и возвратить управление в сценарий, вызвавший его командой call, то нужно использовать ключ /b команды exit. Для выхода из сценария с передачей вызвавшему процессу текущего значения %errorlevel% необходимо использовать команду goto :eof.
Некоторые команды всегда устанавливают переменную %errorlevel%, некоторые модифицируют ее только при возникновении ошибок, а некоторые вообще ее никогда не меняют.
Вот пример:
Копирование
Проверить, удачно ли выполнилась команда можно по коду возврата %errorlevel%.
Использование нескольких команд и символов условной обработки
Можно выполнять несколько команд из одной командной строчки с помощью символов условной обработки, перечисленных в следующей таблице.
| Символ | Синтаксис | Определение |
|---|---|---|
| & [. ] | команда1 & команда2 | Выполняется первая команда, затем вторая команда. |
| && [. ] | команда1 && команда2 | Вторая команда выполняется, только если первая была выполнена успешно. |
| || [. ] | команда1 || команда2 | Вторая команда выполняется, только если первая не была выполнена (полученный код ошибки превышает ноль). |
| ( ) [. ] | ( команда1 & команда2 ) | Используется для группировки или вложения команд. |
| ; или , | команда1 параметр1 ; параметр2 | Используется для разделения параметров команды. |
Примечание:
Амперсанд &, вертикальная черта | и скобки () являются специальными символами, которым должен предшествовать управляющий символ ^ или кавычки, если эти символы передаются в качестве аргументов.
Вот пример специализированного скрипта для сравнения файлов:
Использование переменных среды
Глобальные переменные устанавливаются в свойствах операционной системы или специальной внешней утилитой setx и доступны с одними и теми же значениями при запуске всех пакетных файлов.
Локальные переменные устанавливаются и используются по-своему в каждом отдельном сценарии, сохраняются только во время его выполнения, а также передаются в дочерние сценарии при вложенных вызовах.
Псевдопеременные, такие как %CD%, %DATE%, %TIME%, %RANDOM%, %ERRORLEVEL%, обрабатываются особенным образом в зависимости от определенных условий.
В следующей таблице приведен выборочный список наиболее интересных переменных среды.
| Переменная | Тип | Описание |
|---|---|---|
| Локальная | Возвращает путь к текущей папке. | |
| Системная | Возвращает имя компьютера. | |
| Системная | Возвращает текущую дату. Использует тот же формат, что и команда date /t . | |
| Системная | Возвращает код ошибки последней использовавшейся команды. | |
| Системная | Указывает путь поиска для исполняемых файлов. | |
| Системная | Возвращает произвольное десятичное число от 0 до 32767. | |
| Системная | Возвращает размещение системного каталога Windows. | |
| и | Системная и пользовательская | Возвращает временные папки, по умолчанию используемые приложениями, которые доступны пользователям, выполнившим вход в систему. Некоторые приложения требуют переменную TEMP, другие — переменную TMP. |
| Системная | Возвращает текущее время. Использует тот же формат, что и команда time /t . | Локальная | Возвращает имя пользователя, выполнившего вход в систему. |
При использовании переменных можно также использовать выделение подстрок.
| Конструкция | Назначение |
|---|---|
| %PATH: |
10,5%
-10%
0,-2%
Для установки значений переменных используется команда set.
Установка значений:
set переменная=значение
Показ значений:
set переменная
Показ значений всех переменных:
set (без параметров)
Проверка наличия переменной с заданным именем:
if defined переменная команда
Вычисление арифметических выражений
В следующей таблице представлены арифметические операторы, поддерживающие параметр /a , в порядке убывания приоритета.
| Оператор | Действие оператора |
|---|---|
| () | группировка |
| ! |
—
При использовании символов & | % ^ заключайте выражение в кавычки.
Любые нечисловые строки в выражении считаются именами переменной среды, чьи значения преобразуются в числа до обработки. Если указано имя переменной среды, которое не определено в текущем окружении, ей присваивается значение нуля, что позволяет выполнять арифметические операции со значениями переменной среды без использования % для получения значения.
Пример использования вычисления выражений:
Потоки ввода/вывода
Потоки используются в командных сценариях для унифицированного распределения и перенаправления ввода/вывода.
В следующей таблице представлены стандартные потоки.
| Поток | Номер дескриптора | Описание |
|---|---|---|
| STDIN | 0 | Стандартный ввод (только чтение) |
| STDOUT | 1 | Стандартный вывод (только запись) |
| STDERR | 2 | Вывод ошибок (только запись) |
Каждый поток может быть связан с каким-либо устройством ввода/вывода.
В следующей таблице представлены стандартные устройства.
| Устройство | Описание |
|---|---|
| CON | Консоль (чтение с клавиатуры и вывод на экран) |
| NUL | Пустота |
| PRN | Принтер |
В качестве устройств могут также выступать файлы, заданные по имени.
По умолчанию все стандартные потоки связаны с устройством CON.
В следующей таблице описаны операторы перенаправления, применимые к потокам и устройствам.
| Оператор перенаправления | Описание |
|---|---|
| > | Перенаправление вывода с затиранием. |
| Перенаправление ввода. | |
| >> | Перенаправление вывода с добавлением. |
| >& | Считывает данные на выходе одного потока как входные данные для другого потока. |
| Считывает входные данные одного потока как выходные данные другого потока. | |
| | | Считывает выходные данные одной команды и записывает их на вход другой команды. Эта процедура известна под названием "канал". |
Некоторые команды, такие как find, sort, more, называются фильтрами, т.к. они занимаются специализированной трансформацией входного потока в выходной.
Далее приведены некоторые примеры.
Типичный вызов при тестировании программистских задач.
(Ввод из input.txt, вывод в output.txt, вывод ошибок в никуда).
Вызов скрипта компиляции с перенаправлением потоков вывода и ошибок на дописывание в файл compile.log.
Дописывание содержимого одного файла в конец другого.
Поэкранный вывод списка элементов текущего каталога.
Поэкранный вывод имен всех фидошников города Гомеля, отсортированных по алфавиту.
Организация циклов
Команда for позволяет произвести запуск некоторой команды для каждого элемента из заданного множества.
Синтаксис:
Параметры: < % переменная | %% переменная >Обязательный параметр. Замещаемый параметр. Используйте % переменная для выполнения команды for из командной строки. В пакетных файлах для команды FOR используется запись %%переменная вместо %переменная. Имена переменных учитывают регистр букв (%i отличается от %I). ( множество ) Обязательный параметр. Задает один или несколько файлов, каталогов, диапазон значений или текстовых строк, подлежащих обработке заданной командой. Скобки являются обязательными. команда Обязательный параметр. Задает команду, которая будет выполнена для каждого файла, каталога диапазона значений или текстовой строки, включенной в указанный параметр ( множество ) . ПараметрыКоманднойСтроки Задает параметры командной строки, которые используются с указанной командой.
Подробнее команда описана в справке. Здесь приведены несколько примеров, иллюстрирующих ее возможности.
Перебор фиксированного множества параметров.
Итерация по файлам.
Итерация по каталогам.
Итерация и разбор файлов
Набор содержит имена одного или нескольких файлов, которые по очереди открываются, читаются и обрабатываются. Обработка состоит в чтении файла, разбивки его на отдельные строки текста и выделения из каждой строки заданного числа подстрок (в том числе нуля). Затем найденная подстрока используется в качестве значения переменной при выполнении основного тела цикла. По умолчанию ключ /F выделяет из каждой строки файла первое слово, очищенное от окружающих его пробелов. Пустые строки в файле пропускаются. Необязательный параметр "options" служит для переопределения заданных по умолчанию правил обработки строк.
Возможные ключевые слова для этого параметра:
| Описание | |
|---|---|
| eol=c | Задает символ конца строки (только один символ). |
| skip=n | Задает число строк, пропускаемых в начале файла. |
| delims=xxx | Задает набор разделителей. Заменяет набор разделителей по умолчанию, состоящий из пробела и символа табуляции. |
| Задает элементы, передаваемые из каждой строки в тело цикла for при каждой итерации. В результате размещаются дополнительные имена переменных. Форма m-n задает диапазон, указывающий элементы с m -го по n -ый. Если последним символом строки tokens= является звездочка (*), то размещается дополнительная переменная, в которую помещается остаток строки после разбора последнего элемента. | |
| usebackq | Задает возможность использования кавычек для имен файлов в параметре МножествоИменФайлов . Задает исполнение строки, заключенной в обратные кавычки, как команды, а строки в одиночных кавычках — как команды в символьной строке. |
Поясняющий пример:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
Эта команда обрабатывает файл myfile.txt, пропускает все строки, которые начинаются с символа точки с запятой, и передает вторую и третью подстроки из каждой строки в тело цикла, причем подстроки разделяются запятыми и/или пробелами. В теле цикла переменная %i используется для второй подстроки, %j — для третьей, а %k получает все оставшиеся подстроки после третьей. Имена файлов, содержащие пробелы, необходимо заключать в двойные кавычки. Для того чтобы использовать двойные кавычки, необходимо использовать параметр usebackq, иначе двойные кавычки будут восприняты как границы строки для обработки.
Синтаксис команды FOR /F также позволяет обработать отдельную строку, с указанием параметра filenameset, заключенным в одиночные кавычки. Строка будет обработана как единая строка из входного файла.
Наконец, команда FOR /F позволяет обработать строку вывода другой команды. Для этого следует ввести строку вызова команды в апострофах вместо набора имен файлов в скобках. Строка передается для выполнения обработчику команд CMD.EXE, а вывод этой команды записывается в память и обрабатывается так, как будто строка вывода взята из файла. Например, следующая команда:
FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
выведет перечень имен всех переменных среды, определенных в настоящее время в системе.
Еще один пример:
Организация блокировок
Установка цвета консоли
(CopyLeft) Vadim Kopichenko
Локальные переменные среды
Если системные переменные окружения доступны всегда по всей системе, то локальные работают только в рамках конкретной учётной записи пользователя. Их количество может быть значительным, а состав отличаться даже для разных пользователей одного и того же ПК. Однако, есть ряд переменных, которые обычно присутствуют везде.
| Переменная | Типичное значение | Назначение |
|---|---|---|
| ALLUSERSPROFILE | Обычно: C:All Users (до Windows XP) или C:Program Data (Windows 7 и выше) | Хранит путь к папке с данными установленных программ. |
| CD | Путь | Хранит путь к текущей активной директории, в которой исполняются команды. |
| CLIENTNAME | Текст (если существует) | Если задана, хранит имя компьютера, заданное в настройках текущего пользователя. |
| CMDCMDLINE | Текст | Выдаёт полную команду (с параметрами), которая была использована для последнего запуска Командной строки. |
| LOGONSERVER | Текст | Хранит имя контроллера домена текущего пользователя. |
| PROMPT | Обычно: $P$G | Выдаёт параметры командной строки для текущего интерпретатора. |
| SESSIONNAME | Обычно: Console | Выдаёт название типа текущей сессии Командной строки. При запуске с локального ПК имеет значение "Console". При удалённом вызове – "RDP-Tcp# ". |
| USERDOMAIN | Текст | Хранит имя домена (компьютера), в котором работает пользователь. |
| USERNAME | Текст | Хранит имя учётной записи активного пользователя. |
| USERPROFILE | Обычно: C:Users\%USERNAME% | Выдаёт путь до каталога с профилем пользователя. |
Бывает так, что написанный Вами BAT-файл работает на одном компьютере, но не работает на другом. Ошибка часто заключается в том, что были использованы прямые пути к файлам. Например батник для копирования всех текстовых файлов находящихся в папке windows на диске C
Такой батник будет работать на любом компьютере, только если операционная система установлена на диск С, если ОС расположена на другом диске D,F,K,J и т.д., необходимо использовать переменную %WINDIR%
Такой батник будет работать на любом компьютере — без разницы на какой диск установлена ОС
Переменные среды — текстовые переменные операционной системы, хранящие данные о ряде настроек системы. Используются переменные среды при копировании, перемещении, переименовании, удалении, создании файлов и папок других действий в командной строке.
Список переменных среды ОС Windows Вы можете посмотреть введя в командной строке: set и нажав клавишу Enter Также можно вывести список переменных в текстовый файл с помощью батника
Bat-файл с таким кодом создаст текстовый файл docent.txt(здесь и далее имена подставляйте свои)и выведет список переменных среды ОС Windows в этот текстовый документ в том-же месте где и располагается запущенный батник.
Список переменных сред
%ALLUSERSPROFILE% размещение профиля «All Users»
%APPDATA% используемое по умолчанию размещение данных приложений
%CD% путь к текущей папке
%CMDCMDLINE% строка команд, с помощью которой был запущен данный экземпляр Cmd.exe
%CMDEXTVERSION% номер версии текущих расширений обработчика команд
%COMPUTERNAME% имя компьютера
%COMSPEC% путь к исполняемой командной оболочке
%DATE% текущие данные, использует тот же формат, что и команда date /t
%ERRORLEVEL% код ошибки последней использовавшейся команды
%HOMEDRIVE% имя диска локальной рабочей станции
%HOMEPATH% полный путь к основному каталогу пользователя
%HOMESHARE% сетевой путь к общему основному каталогу пользователя
%LOGONSEVER% имя контроллера домена, который проверял подлинность текущей сессии
%NUMBER_OF_PROCESSORS% количество процессоров, установленных на компьютере
%OS% имя операционной системы
%PATHEXT% список расширений файлов
%PROCESSOR_ARCHITECTURE% архитектура процессора. Значения: x86, IA64
%PROCESSOR_IDENTFIER% описание процессора
%PROCESSOR_LEVEL% номер модели процессора, установленного на компьютере
%PROCESSOR_REVISION% номер модификации процессора
%ProgramFiles% путь к Program Files
%PROMPT% параметры командной строки для текущего интерпретатора
%RANDOM% произвольное десятичное число от 0 до 32767
%SYSTEMDRIVE% имя диска, содержащего корневой каталог
%SYSTEMROOT% размещение системного каталога Windows
%TIME% текущее время
%USERDOMAIN% имя домена, содержащего список учетных записей пользователей
%USERNAME% имя пользователя, выполнившего вход в систему
%USERPROFILE% размещение профиля для текущего пользователя
%WINDIR% размещение каталога операционной системы
Если Вы хотите посмотреть чему равна переменная среды на Вашем компьютере в командной строке(окно CMD), не забывайте прописывать впереди переменной «echo»
echo — команда предназначенная для отображения строки текста
Например если Вы захотите узнать текущее время %TIME% и просто напишите %TIME% в CMD — то получите ошибку: «Синтаксическая ошибка в имени файла, имени папки или метке тома»
Если напишете echo %TIME% — то узнаете точное время
Батником вывести информацию в txt можно так
echo сегодня %DATE% время %TIME% >> docent.txt
echo имя компьютера %COMPUTERNAME% >> docent.txt
echo имя юзера %USERNAME% >> docent.txt
echo где Винда %WINDIR% >> docent.txt
echo и т.д. и т.п >> docent.txt
Использование переменной при удалении файлов и папок с помощью Bat файла
Удаление папки Docent которая находится на диске С в WINDOWS
RD С:WINDOWSDocent /S/Q
То-же самое, но удаляем папку с помощью переменной %WINDIR%
RD %WINDIR%Docent /S/Q
Использование переменной при перемещении файлов
Перемещение текстового файла docent.txt из папки WINDOWS на диске С в папку Program Files которая тоже на диске С
MOVE «C:WINDOWSdocent.txt» «C:Program Files»
То-же самое, но перемещаем с помощью переменных %WINDIR% и %ProgramFiles%
Иногда в скриптах необходимо использовать путь папки в которой мы находимся в текущий момент. Расположение текущей папки (полный путь) хранится в переменной %CD%

Можно вывести на экран текущую директорию и путь к ней в консоли, например так
Использование системных переменных необходимо при написании командных сценариев для консоли Windows, т.е. bat или cmd файлов.
Значение и названия некоторых других переменных Windows можно узнать выполнив в командной строке (cmd.exe) команду
P.S. иногда можно написать нужный скрипт в пару строк, если правильно использовать структуру, нужные команды и встроенные переменные Windows
Фразы: текущий каталог в скрипте, вывести переменную путь, как узнать каталог в котором выполняется скрипт?





