Найти в Дзене

Командная строка Windows 6. Взаимодействие с пользователем, переменные, операторы ветвления

Оглавление

Раз уж обсудили создание батников, надо рассказать и об "интерактиве" - вводе данных пользователем и операторах ветвления.

Выбор варианта - CHOICE

Пользователю будет предложено ввести с клавиатуры букву варианта. Номер варианта (нумерация начинается с 1) будет записан в переменную ERRORLEVEL. Ее значение затем можно будет использовать в операторе ветвления IF, ну, или где-то еще...

CHOICE [/C список] [/N] [/CS] [/T тайм-аут /D элемент] [/M текст]

Если выбрать Y, ERRORLEVEL = 1; если N - ERRORLEVEL = 2
Если выбрать Y, ERRORLEVEL = 1; если N - ERRORLEVEL = 2

/C <список> Список выбираемых элементов. По умолчанию "YN" (да/нет).
Если будете вводить символ не из списка, компьютер будет недовольно пищать :)
/M <текст> Сообщение, отображаемое перед приглашением
/CS Включение учета регистра при выборе элементов. По умолчанию регистр символов не учитывается

choice /C YyNC /CS /M "Да, д-да?, Нет, Отмена"
choice /C YyNC /CS /M "Да, д-да?, Нет, Отмена"

/N Скрытие списка элементов в приглашении
/T <тайм-аут> Число секунд перед выбором элемента по умолчанию.
Допустимыми являются значения от 0 до 9999. Если указан 0, пауза отсутствует
/D <элемент> Элемент, выбираемый по умолчанию через nnnn секунд

choice /C YNC /N /T 1 /D N - Через 1 секунду программа сама скажет "нет"
choice /C YNC /N /T 1 /D N - Через 1 секунду программа сама скажет "нет"

Задавать вопросы пользователю научились, теперь рассмотрим:

Вывод и ввод переменных - SET

Если ввести просто SET без ключей и аргументов, то будет выдан список всех переменных среды:

И т.д. и т.п.
И т.д. и т.п.

Если ввести SET <начало имени переменной или полное имя переменной>, то они уже будут отфильтрованы по имени:

-5

Если переменной, подходящей под фильтр, не существует, то команда установит ERRORLEVEL = 1.

Отмечу отдельно специальные переменные, вычисляемые динамически при использовании:

%CD% - текущий каталог
%DATE% - текущая дата с форматом команды DATE
%TIME% - текущая дата с форматом команды TIME
%RANDOM% - случайное число в диапазоне от 0 до 32767

-6

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

Ключ /A указывает, что строка справа от знака равенства является числовым выражением, значение которого вычисляется.

Список операций в порядке убывания приоритета:
() группировка
! ~ - унарные операторы
* / % арифметические операторы
+ - арифметические операторы
<< >> двоичный сдвиг
& двоичное И
^ двоичное исключающее ИЛИ
| двоичное ИЛИ
= *= /= %= += -= &= ^= |= <<= >>= присвоение
, разделитель операторов

Пример работы арифметических операторов
Пример работы арифметических операторов

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

Можно записывать шестнадцатеричные числа, используя префикс 0x, и восьмеричные, с префиксом 0.

Пример работы логических операций
Пример работы логических операций

Любые символьные строки в выражении рассматриваются как имена переменных среды, значения которых будут подставлены в выражение. Если переменная с указанным именем не существует, вместо нее будет подставлен ноль.

-9

Ключ /P позволяет ввести значение строки с клавиатуры. Можно добавить строку-приглашение:

SET /P MY_VAR="Приглашение: "
SET /P MY_VAR="Приглашение: "

Довольно полезным может оказаться выделение подстроки:

%<имя переменной>:~<номер первого символа>,<длина подстроки>%

Примеры:

%MY_VAR:~0,8% - вывести первые 8 символов строки

%MY_VAR:~9% - вывести все после 9 символа

%MY_VAR:~-11% - вывести последние 11 символов

%MY_VAR:~0,-9% - вывести все, кроме последних 9 символов

-11

Данные вводить научились, теперь используем их для ветвления программы.

Оператор ветвления - IF

Если логическое выражение после IF верно, выполняется первая команда, если неверно - то вторая команда.
Если добавить слово
NOT, логическое выражение инвертируется.

IF [NOT] <логическое выражение> команда_1 ELSE команда_2

Переносить строки нельзя, но можно заключать команды в скобки. Если нужно выполнить много команд, лучше использовать GOTO.

Самое простое применение IF - сравнить переменную с числом:

-12

Операторы сравнения следующие:
EQU или == - равно
NEQ - не равно
LSS - меньше
LEQ - меньше или равно
GTR - больше
GEQ - больше или равно

Можно сравнивать строки:

-13

Ключ /I позволяет игнорировать регистр строк.

Можно установить в качестве условия существование файла (если файл с указанным именем существует, выполнить команду):

Символ * заменяет любые символы
Символ * заменяет любые символы

Условие DEFINED напоминает EXIST, но принимает в качестве аргумента имя переменной среды и возвращает истинное значение, если эта переменная определена:

-15

Вот такой интерактив есть в CMD... В следующий раз будем использовать его для построения бэкапера :)

Ну, и напоследок, список моих статей про CMD: