- Сообщения
- 8,071
- Решения
- 20
- Реакции
- 6,877
Переменные. Команда SET
Задание переменных
Вручную
CMD/BATCH:
set x=stroka
set /a y=55
CMD/BATCH:
set /p x="BBeduTe cTpoky: "
Типы переменных
Тип строка
CMD/BATCH:
set x=stroka
Тип число
CMD/BATCH:
set /a x=25*5
Использование переменных
Вывод значения переменных
CMD/BATCH:
echo %x%
Существующие переменные
%RANDOM% - раскрывается в случайное десятичное число между 0 и 32767.(от 0 до (2^17)-1)
CMD/BATCH:
set /a random10=%random%/3277
У меня это число по нелепой псевдослучайности цифру секунды
%CD% - раскрывается в строку текущей директории.
%DATE% - раскрывается в текущую дату, используя тот же формат команды DATE.
%TIME% - раскрывается в текущую дату, используя формат команды TIME.
%ERRORLEVEL% - раскрывается в текущее значение ERRORLEVEL.
Уровень ошибки, 0 - это нет ошибки, 1 - это есть ошибка, а другие это номера ошибки.
Чтобы получить полный список переменных и их значений введите команду SET
Операции со строковыми или численными переменными
Соединение 2-ух строковых переменных
CMD/BATCH:
set x=Gaz
set y=Prom
echo %x%%y%
(GazProm)
Вывод определенного(ых) символа(ов) из строки
Символы номеруются начиная с 0!
CMD/BATCH:
set str=babywka
Вывод 1-ого символа
CMD/BATCH:
echo %str:~0,1%
(b)
Вывод 3-х символов с конца строки
CMD/BATCH:
echo %str:~-3%
(wka)
Вывод всей строки кроме 2-ух первых символов
CMD/BATCH:
echo %str:~2%
(bywka)
Вывод всей строки кроме 2-ух последних символов
CMD/BATCH:
echo %str:~0,-2%
(babyw)
Вывод 3-х символов начиная с 3
CMD/BATCH:
echo %str:~2,3%
(byw)
Удаление подстроки из строки
CMD/BATCH:
set str=babywka
echo %str:ba=%
(bywka)
Замена подстроки из строки на другую подстроку
CMD/BATCH:
set str=babywka
echo %str:bab=xlop%
(xlopywka)
Удаление кавычек(") из строки
CMD/BATCH:
set str2="qwerty"
echo %str2:"=%
(qwert)
CMD/BATCH:
echo %str2:~1,-1%
(qwert)
Существуют 2 способа использовать переменную в переменной, например: вывод n-ого символа
Первый способ с call set
CMD/BATCH:
call set x=%%str:~%n%,1%%
echo %x%
Второй способ с for и setlocal enabledelayedexpansion
CMD/BATCH:
setlocal enabledelayedexpansion
for /l %%i in (%n%,1,%n%) do (set x=!str:~%%i,1!)
echo %x%
CMD/BATCH:
set x=!str:~%n%,1!
С циклами мы разберемся в следующей статье.
Но, пока уточню: если код второго способа юзать в пакетном файле (BATнике), то вместо %i юзаем %%i.
Операции с числовыми переменными
Увеличивание на единицу
CMD/BATCH:
set /a x+=1
Увеличивание в 2 раза
CMD/BATCH:
set /a x+=%x%
CMD/BATCH:
set /a x*=2
Возведение в квадрат
CMD/BATCH:
set /a x*=%x%
Возведение в куб
CMD/BATCH:
set /a x=%x%*%x%*%x%
Деление
Деление в CMD является целочисленным!(то есть делится до целого числа)
CMD/BATCH:
set /a x=15
set /a y=4
set /a xy=%x%/%y%
(3)
Сложение
CMD/BATCH:
set /a x=5
set /a y=-6
set /a xy=%x%+%y%
(5+(-6)=5-6=-1)
Вычитание
CMD/BATCH:
set /a x=5
set /a y=-6
set /a xy=%x%-%y%
(5-(-6)=5+6=11)
Вычисление остатка от деления
CMD/BATCH:
set /a xy=%x% "%" %y%
Унарные операторы
Логическое отрицание (Logical NOT)
CMD/BATCH:
set /a y="!"%x%
CMD/BATCH:
Например
set /a x=5
set /a y="!"%x%
(0)
set /a x=0
set /a y="!"%x%
(1)
Побитовая инверсия (Bitwise NOT):
CMD/BATCH:
set /a y="~"%x%
Например
CMD/BATCH:
set /a x=5
set /a y="~"%x%
(-1-5=-(1+5)= -6)
set /a x=-3
set /a y="~"%x%
(-1-(-3)=-1+3=3-1= 2)
Унарный минус (устанавливает/сбрасывает знаковый бит)
CMD/BATCH:
set /a y="-"%x%
Например
CMD/BATCH:
set /a x=5
set /a y="-"%x%
(-5)
set /a x=-3
set /a y="-"%x%
(3)
Двоичные операторы
CMD/BATCH:
set x=3
(в двоичной системе счисления - 0011)
set y=5
(в двоичной системе счисления - 0101)
Побитовое И (AND)
Побитовое И — это бинарная операция, действие которой эквивалентно применению логического И к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.
Другими словами, если оба соответствующих бита операндов равны 1, результирующий двоичный разряд равен 1; если же хотя бы один бит из пары равен 0, результирующий двоичный разряд равен 0.
CMD/BATCH:
set /a xy=%x%"&"%y%
(1, в двоичной системе счисления - 0001)
Побитовое ИЛИ (OR)
Побитовое ИЛИ — это бинарная операция, действие которой эквивалентно применению логического ИЛИ к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.
Другими словами, если оба соответствующих бита операндов равны 0, двоичный разряд результата равен 0; если же хотя бы один бит из пары равен 1, двоичный разряд результата равен 1.
CMD/BATCH:
set /a xy=%x%"|"%y%
(7, в двоичной системе счисления - 0111)
Побитовое исключающее ИЛИ (XOR)
Побитовое исключающее ИЛИ (или побитовое сложение по модулю два) — это бинарная операция, действие которой эквивалентно применению логического исключающего ИЛИ к каждой паре битов, которые стоят на
одинаковых позициях в двоичных представлениях операндов.
Другими словами, если соответствующие биты операндов различны, то двоичный разряд результата равен 1; если же биты совпадают, то двоичный разряд результата равен 0.
CMD/BATCH:
set /a xy=%x%"^"%y%
(6, в двоичной системе счисления - 0110)
К битовым операциям также относят битовые сдвиги. При сдвиге значения битов копируются в соседние по направлению сдвига.
Различают сдвиг влево (в направлении от младшего бита к старшему) и вправо (в направлении от старшего бита к младшему).
При логическом сдвиге значение последнего бита по направлению сдвига теряется (копируясь в бит переноса), а первый приобретает нулевое значение.
Двоичный арифметический сдвиг
Арифметический сдвиг аналогичен логическому, но значение слова считается знаковым числом, представленным в дополнительном коде.
Так, при правом сдвиге старший бит сохраняет свое значение. Левый арифметический сдвиг идентичен логическому.
Вправо
CMD/BATCH:
set /a xy=%x%">>"1
(1, в двоичной системе счисления - 0011->0001)
set /a xy2=%y%">>"1
(2, в двоичной системе счисления - 0101->0010)
set /a n=13
(в двоичной системе счисления - 1101)
set /a xn=%n%">>"2
(3, в двоичной системе счисления - 1101->0011)
set /a my=-%y%">>"1
(-3, в двоичной системе счисления - 1011(-5)->1101(-3))
Влево
CMD/BATCH:
set /a xy=%x%"<<"1
(6, в двоичной системе счисления - 0011->0110)
set /a xy2=%y%"<<"1
(10, в двоичной системе счисления - 0101->1010)
set /a xy3=%y%"<<"4
(80, в двоичной системе счисления - 0101->1010000)
set /a my=-%y%"<<"1
(-10, в двоичной системе счисления - 1011(-5)->10110(-10))
Максимальный размер отдельной переменной среды составляет 8192 байта.(у меня выходило только 8184, наверное это вместе с названием...)
Максимальный общий размер всех переменных среды, включая имена переменных и знак равенства, составляет 65 536 Кбайт.
И я забыл, про 8-ричную и 16-ричную систему счисления в CMD
Системы счисления
Числовые значения рассматриваются как десятичные, если перед ними не стоит префикс 0x для шестнадцатеричных чисел, и 0 для восьмеричных чисел. Например, числа 0x12, и 022 обозначают десятичное число 18.
Обратите внимание на запись восьмеричных числе: 08 и 09 не являются допустимыми числами, так как в восьмеричной системе исчисления цифры 8 и 9 не используются.
Восьмеричная система счисления
CMD/BATCH:
set /a x=022
(Это 22 в восьмеричной системе счисления, и 18 в десятичной)
Но после задания значения переменной, значение хранится в десятичной системе счисления.
Например, сложение
CMD/BATCH:
set /a xy=022+07
(Это 22+7=31 в восьмеричной системе счисления, и 31 в десятичной)
Шестнадцатеричная система счисления
CMD/BATCH:
set /a x=0x3A
(Это 3A в восьмеричной системе счисления, и 58 в десятичной)
CMD/BATCH:
set /a xy=0x3A-0x66
(Это 3A-66=-54 в восьмеричной системе счисления, и -44 в десятичной)
Сохранение в переменной вывода программы
К сожаление, передача вывода программ на вход команды set не работает:
CMD/BATCH:
echo 1|set /p AA=""
set AA
CMD/BATCH:
echo 1> 0.tmp
set /p AA="" <0.tmp
del 0.tmp
echo %AA%
Примеры использования
Узнать динамически генерируемое имя архива WinRar:
CMD/BATCH:
rar a -z%Comment% -p%p% "-ag yyyy-mm-dd[n]" %OutPath%\%arhivename%.%ext% @%FileList% >rar.log.tmp
for /f "tokens=2*" %%I in ('find /i "Creating archive" ^<rar.log.tmp') do @echo %%J >rarfilename.tmp
set /p rarfilename="" <rarfilename.tmp
del rarfilename.tmp
Узнать имя последнего изменённого файла в папке:
CMD/BATCH:
dir /b /a-d /o-d *.* >%temp%\0.tmp
set /p lastfile="" <%temp%\0.tmp
del %temp%\0.tmp
echo "%lastfile%"
Комментарий от Dragokas :
По сути эта команда считывает в переменную первую строку файла:
CMD/BATCH:
set /p stroka=<file.txt
Комментарий от m00slim25:
Эти операции, как и все остальные, поддерживают кавычный синтаксис:
CMD/BATCH:
set /a "y=!%x%"
set /a "y=~%x%"
set /a "y=-%x%"
Оператор == используется только для строчного сравнения. Кавычки необходимы если в переменной/операнде имеются пробелы.
Для арифметического сравнения необходимо использовать арифметические операторы:
EQU : Равно (=)
NEQ : Не равно (!=)
LSS : Меньше (<)
LEQ : Меньше или равно (<=)
GTR : Больше (>)
GEQ : Больше или равно (>=)
Использовать операторы, указанные в скобках, не представляется возможным, потому что, например, операторы < и > являются указателями перенаправления ввода-вывода.
Последнее редактирование: