Переменные в CMD, команда SET и арифметика

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
7,814
Реакции
6,593

Переменные. Команда SET

Задание переменных

Вручную
CMD/BATCH:
set x=stroka
set /a y=55
Ввод с клавиатуры
CMD/BATCH:
set /p x="BBeduTe cTpoky: "

Типы переменных

Тип строка
CMD/BATCH:
set x=stroka
Ограничение 8184 символа.
Тип число
CMD/BATCH:
set /a x=25*5
Ограничение от -2147483647 до 2147483647.

Использование переменных

Вывод значения переменных
CMD/BATCH:
echo %x%

Существующие переменные

%RANDOM% - раскрывается в случайное десятичное число между 0 и 32767.(от 0 до (2^17)-1)
CMD/BATCH:
set /a random10=%random%/3277
Выводит случайное число от 0 до 9.
У меня это число по нелепой псевдослучайности цифру секунды
%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%
тут неважно что в for писать, главное
CMD/BATCH:
set x=!str:~%n%,1!
писать в do
С циклами мы разберемся в следующей статье.
Но, пока уточню: если код второго способа юзать в пакетном файле (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%
дает результат(%y%) 1 (True), если переменная(%x%) равна 0 (False), и 0 (False) (%y%) в любых других случаях
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%
дает результат -1-%x% (%y%)
Например
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%
дает результат 0-%x% (%y%)
Например
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 : Больше или равно (>=)
Использовать операторы, указанные в скобках, не представляется возможным, потому что, например, операторы < и > являются указателями перенаправления ввода-вывода.
 
Последнее редактирование:
Урезание части строки, замена значения в переменной:
Var_Replacing.png

CMD/BATCH:
@Echo Off
:: Кодировка файла 'Кириллица DOS' (866)
Set var=123456789
Echo.
Echo             Запись     Значение
Echo.
Echo Переменная полностью       %%var%%     %var%
Echo.
Echo Первые три символа       %%var:~0,3%%   %var:~0,3%
Echo Последние три символа       %%var:~-3%%   %var:~-3%
Echo Три символа начиная с шестого     %%var:~5,3%%   %var:~5,3%
Echo Без первых трех символов     %%var:~3%%   %var:~3%
Echo Без последних трех символов     %%var:~0,-3%%   %var:~0,-3%
Echo Без первых двух и последних трех   %%var:~2,-3%%   %var:~2,-3%
Echo.
Echo Замена части переменной (45 на abc)   %%var:45=abc%%   %var:45=abc%
Echo Замена части переменной и символов
Echo до нее (23, и все что до этого, на xyz) %%var:*23=xyz%%   %var:*23=xyz%
Echo Удаление части переменной (567)     %%var:567=%%   %var:567=%
Pause>Nul
Вывод текста без переноса на новую строку
CMD/BATCH:
@echo off
<nul set /p strTemp=Весь этот текст
<nul set /p strTemp=будет находиться
<nul set /p strTemp=на одной строке.
echo.
echo Новая строка
Ограничение - будет модифицирована переменная. Следует выбрать переменную, модификация которой не нарушит работу скрипта или использовать setlocal / endlocal.

Undocumented Dynamic variables (read only)
Спасибо Charles Kludge
%__CD__% текущий каталог, с бэкслэшем '\' в хвосте;
%=C:% Текуший каталог на диске C:
%=D:% Текуший каталог на диске D:,E:,F:...(буковку подставите), если к нему было обращение в текущем сеансе CMD.EXE
%=ExitCode% Шестнадцатеричное значение кода возврата по EXIT /B
%=ExitCodeAscii% Символьное (ASCII) представление кода возврата по EXIT /B, если он больше 32 (пробел).
CMD/BATCH:
@echo off
echo %__CD__%
echo %=C:%
set "decimal=%1"
cmd /c exit /b  %decimal%
echo ASCII(как символ) exitcode: %=ExitCodeAscii%
echo Hex exitcode: %=ExitCode%
pause
 
Последнее редактирование:
Полезные функции

Арифметика:

Получить уникальное имя файла во временной папке
CMD/BATCH:
@echo off
Call :GetTemporaryName Name
Echo Temporary Name is %Name%
pause& exit

:GetTemporaryName %varName%
set sTempName=%temp%\temp%random%.tmp
if exist "%sTempName%" (goto :GetTemporaryName) else (set %1=%sTempName%)
Получить случайное число в пределах ...
Мы знаем, что переменная %RANDOM% выводит значение в области от 0 до 32767,
а что если нам нужно диапазон уже, к примеру от -50 до 50? Вот решение:
CMD/BATCH:
@Echo Off
SetLocal
set min=-50
set max=50
set /a i=%random%%%(max-min+1)+min
Echo:%i%
pause>nul
Вычисление степени числа
Подпрограмма и пример использования:
CMD/BATCH:
@Echo Off
Setlocal EnableDelayedExpansion
Set /A num=3
::Вычисляем 3 в 4-й степени
Call :Stepping num 4
Echo %num%
pause
exit /B

:Stepping %1 - Переменная с числом %2 - Степень
set /A s=%2
if %s%==0 (Set /A %1=1& exit /b)
if %s%==1 exit /b
set step=%3
if not defined step set step=!%1!
set /A s-=1
set /A %1*=%step%
Call :Stepping %1 %s% %step%
exit /b
Деление с выведением дробной части
Как известно в бат-файлах есть только операция целочисленного деления
и получения остатка от деления. Получить дробное число нельзя. Решил восполнить этот пробел:
CMD/BATCH:
::Деление с выводом дробной части на батниках - by Dragokas
@echo off
::Введите ограничение точности (знаков после точки)
::Не более 8 знаков !!! (ограничение арифметики от -2147483647 до 2147483647.)
Set /A Znak=8
::Введите делимое
Set /A n1=7
::Введите делитель
Set /A n2=6
::Разделитель целой и дробной части
Set Delim=.

Set /A nC=n1/n2
Set /A nO=%n1% %% %n2%
if %nO%==0 Goto :ret
Set /A nD=nO
For /L %%A in (1,1,%Znak%) do Set /A nD*=10
Set /A nD=nd/n2
:Trim0
Set /A rest=%nd% %% 10
if %rest%==0 (Set /A nd/=10& Goto :Trim0)
Set nd=%Delim%%nD%
:ret
Echo %nC%%nD%
pause>nul
Алгоритм получения дробной части:
Остаток от деления * (10^(знаков после запятой)) / делитель.
Потом убираются лишние концевые нули у дробной части.
Деление через строковую математику
Отличие от встроенного в CMD деления: исходное число (делимое) может превышать границу для числового типа данных CMD
(актуально для Гигабайтов данных, представленных в виде байтов, для дальнейшего перевода в более удобо-читаемую единицу измерения).

CMD/BATCH:
:: Деление через строковую математику - by Dragokas
@echo off
SetLocal EnableDelayedExpansion
::Делимое
set Num1=16261316608
::Делитель
Set Num2=1024
::Макс. кол-во знаков после запятой в результате
Set MaxZ=2
set /a Num1_pos=-1
:AddNum1
set /a Num1_pos+=1
::если строка закончилась
if "!Num1:~%Num1_pos%,1!"=="" Goto AfterZiro
Set Num1_part=%Num1_part%!Num1:~%Num1_pos%,1!
if %Num1_part%==00 Set Num1_part=0
Call :TryDiv
Goto AddNum1
:AfterZiro
if %Num1_part%==0 goto Div_End
if %MaxZ% neq 0 Set ResultAll=%ResultAll%.
Set Zero_Marker=true
:AddZiro
Set /A MaxZ-=1
if %MaxZ% LSS 0 Goto Div_End
echo %Num1_part%
if %Num1_part%==0 goto Div_End
Set Num1_part=%Num1_part%0
Call :TryDiv
Goto AddZiro
:Div_End
echo %ResultAll%
pause
Goto :eof
:TryDiv
Set /a Result=Num1_part / Num2
echo %Num1_part%-%result%
if %Result% neq 0 (
  Set ResultAll=%ResultAll%%Result%
  Set /A Num1_part=Num1_part - Result * Num2
) else (if "%ResultAll%" neq "" if not Defined Zero_Marker Set ResultAll=%ResultAll%0)
Exit /B
Пример довольно прямолинеен, и не оптимизирован. Зато работает верно, надеюсь :)
Логические операции сравнения для чисел, превышающих арифметику CMD
Пример использования:
CMD/BATCH:
@echo off
SetLocal EnableExtensions
Call :Logica -2147483648 2147483648 LSS && echo false || echo true
echo errorlevel = %errorlevel%
<nul set /p x=Результат сравнения:
if "%errorlevel%"=="0" (echo false)
if "%errorlevel%"=="1" (echo true)
if "%errorlevel%"=="2" (echo error)
pause
goto :eof
CMD/BATCH:
:Logica
:: Логические операции сравнения для чисел, превышающих арифметику CMD - by Dragokas
:: Возвращает Errorlevel 1, если true, или 0, если false, 2, если неверно введен параметр
:: %1 - 1-е число
:: %2 - 2-е число
:: %3 - Логическая операция.
:: Допустимые операции:
:: LSS - меньше
:: lEQ - меньше или равно
:: GTR - больше
:: GEQ - больше или равно
  set operation=%~3
  set numb1=%~1
  set numb2=%~2
  ::Удаляем знаки +
  if "%numb1:~0,1%"=="+" set numb1=%numb1:~1%
  if "%numb2:~0,1%"=="+" set numb2=%numb2:~1%
  ::Проверка на равенство
  if "%numb1%"=="%numb2%" (
  if /i "%operation%"=="lEQ" exit /B 1
  if /i "%operation%"=="GEQ" exit /B 1
  if /i "%operation%"=="lSS" exit /B 0
  if /i "%operation%"=="GTR" exit /B 0
  )
  if /i "%operation%"=="lEQ" set operation=LSS
  if /i "%operation%"=="GEQ" set operation=GTR
  ::Если сравниваются отрицательные числа, нужно в конце переворачивать логику
  set inverse=
  if "%numb1:~0,1%"=="-" if "%numb2:~0,1%"=="-" set inverse=true
  ::Проверка на знак
  if "%numb1:~0,1%"=="-" if "%numb2:~0,1%" NEQ "-" (set mean=LSS& goto :ext_Logica)
  if "%numb2:~0,1%"=="-" if "%numb1:~0,1%" NEQ "-" (set mean=GTR& goto :ext_Logica)
  ::Удаляем знаки -
  if "%numb1:~0,1%"=="-" set numb1=%numb1:~1%
  if "%numb2:~0,1%"=="-" set numb2=%numb2:~1%
  :s_Logica
  ::Берем цифры по одному разряду справа
  if "%numb1%"=="" (set r1=) else (set r1=%numb1:~-1%)
  if "%numb2%"=="" (set r2=) else (set r2=%numb2:~-1%)
  if "%r1%"=="" if "%r2%"=="" goto ext_Logica
  if "%r1%"=="" set r1=0
  if "%r2%"=="" set r2=0
  if %r1% NEQ %r2% if %r1% GTR %r2% (set mean=GTR) else (set mean=LSS)
  if "%numb1%" neq "" set numb1=%numb1:~0,-1%
  if "%numb2%" neq "" set numb2=%numb2:~0,-1%
  goto s_Logica
  :ext_Logica
  if defined inverse if "%mean%"=="GTR" (set mean=LSS) else (set mean=GTR)
  if "%operation%"=="GTR" if "%mean%"=="GTR" (exit /B 1) else (exit /B 0)
  if "%operation%"=="LSS" if "%mean%"=="LSS" (exit /B 1) else (exit /B 0)
exit /B 2
Перевод чисел из десятеричной системы в любую (2-16)
Спасибо FraidZZ.
CMD/BATCH:
@echo off
::Первый параметр - число в десятичное системе счисления.
::Второй параметр - основание выходной системы счисления (от 2 до 16)
setlocal enabledelayedexpansion
chcp 1251>nul
set dec=%~1
if not "%~2"=="" (set osn=%~2) else (set osn=2)
if !dec! LSS 0 (set /a dec=0 - !dec!&set mn=1)
set tempr=!dec!
set bin=
set H=set HEX.
!H!10=A&!H!11=B&!H!12=C&!H!13=D&!H!14=E&!H!15=F
if !osn! GTR 16 (echo.Слишком большое основание. Максимум 16&exit /b)
if !osn! LSS 2 (echo.Слишком маленькое основание. Минимум 2&exit /b)
:again
if !tempr! LSS 2 (goto :out)
set /a tbin=!tempr! %% !osn!
set /a tmchs=!tempr! - !tbin!
set /a tempr=!tmchs! / !osn!
if !tbin! GEQ 10 (set tbin=!HEX.%tbin%!)
set bin=!tbin!!bin!
goto :again
:out
if "!bin!"=="" (set bin=0)
if not !tempr!==0 (set bin=!tempr!!bin!)
if "!mn!"=="1" (set bin=-!bin!)
echo.!bin!
endlocal&exit /b
Строки:

Проверка на содержание подстроки в строке
Спасибо Smitis
1. Простой вариант - проверка на содержимое в строке заданной подстроки
CMD/BATCH:
set a=qwerty
if "%a:ty=%" neq "%a%"  echo "ty" present in string
Принцип работы: если подстрока присутствует в строке, она будет удалена и результат не будет равен исходной строке.
Не работает с пустыми строками.

2. Вариант, когда подстрока тоже в переменной
CMD/BATCH:
setlocal enabledelayedexpansion
set a=asdfgh
set b=df
if "!a:%b%=!" neq "!a!"  echo "%b%" present in string "%a%"
Изменение регистра всех букв в тексте
Пример использования и функция:

CMD/BATCH:
@echo off
Setlocal EnableDelayedExpansion
:: исходный текст
set Utext= Up case text--~@#*()_+-
Call :Case Utext U
:: текст после преобразования в U - верхний регистр
echo %Utext%

:: исходный текст
set Ltext=lAW CASE TEXT--~@#*()_+-
Call :Case Ltext L
:: текст после преобразования в L - нижний регистр
echo %Ltext%

pause
Goto :eof

:Case %1-var %2.option-L-or-U
if not Defined CaseA Call :FillSlovar
set word=!%~1!
if not Defined word Exit /B
set tempvar=
set /A n=-1
:newsymbol
set /A n+=1
set "symb=!word:~%n%,1!"
if "%symb%"=="" (Set "%~1=%tempvar%"& Exit /B)
if "!case%~2%symb%!"=="" (
  set "tempvar=%tempvar%%symb%"
) else (
  set "tempvar=%tempvar%!case%~2%symb%!"
)
goto :newsymbol

:FillSlovar
Set AlphabetL=abcdefghigklmnopqrstuvwxyz
Set AlphabetU=ABCDEFGHIJKLMNOPQRSTUVWXYZ
For /L %%C in (0,1,25) do (
  set caseU!AlphabetL:~%%C,1!=!AlphabetU:~%%C,1!
  set caseL!AlphabetU:~%%C,1!=!AlphabetL:~%%C,1!
)
Exit /B
Получение N-й строки из файла без использования (!) - DelayedExpansion
Спасибо: m0nkrus, FraidZZ, aGerman (dostips.com)
Пример для получения 5-й строки:
CMD/BATCH:
<test.txt (
  for /l %%i in (1 1 4) do set /p "="
  set /p "st="
)
for /f "tokens=1* delims==" %%i in ("%st%") do set "st=%%j"
echo %st%
pause

Получение символа BackSpace (0x08) в переменную
Спасибо: jeb (dostips.com)
CMD/BATCH:
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H# & echo on & for %%A in (1) do rem"') do set "DEL=%%a"
 
Последнее редактирование:
Здравствуйте, не совсем понял про шестнадцатеричную систему. Мне надо день месяца, месяц и год вывести в шестьнадцатеричной системе. Как это будет выглядеть в bat?
 
Здравствуйте, @Talory !
Добро пожаловать на SafeZone.

О какой части статьи идёт речь?
 
Про системы счисления. Хочу через bat файл в реестре сделать изменения в значении файла. Необходимо внести нынешнию дату в шестьнадцатеричной системе
 
Мне надо день месяца, месяц и год вывести в шестьнадцатеричной системе.
Я не могу сказать, не увидев примера подобной записи.
Существуют различные форматы и кодировать их придётся по-разному.
Для изучения: https://safezone.cc/resources/registry-time-decoder.205/
И по этому поводу лучше создать отдельную тему.

В общем случае, перевод с 10-СС в 16 будет через Batch выглядеть так:
Код:
cmd /c exit /b 11
echo %=ExitCode%
(перевод числа 11 в "0000000B")
 
Здравствуйте, а как я могу сделать, что бы система проверяла меньше ли числовая переменная определенного числа? Я не нашел данного в статье
 
Код:
if /?
IF [/I] строка1 оператор_сравнения строка2 команда

EQL - равно
NEQ - не равно
LSS - меньше
LEQ - меньше или равно
GTR - больше
GEQ - больше или равно,
 
Похоже, ошибка во встроенной документации.

Вместо EQL должно быть EQU
/i - не нужна т.к. у вас сравнение математическое, а не текстовое
Переменную нужно подавать в раскрытом виде:
Код:
IF %A% EQU 70 (echo test)
Для операции равенства можно ещё так или так:
Код:
IF %A%==70 (echo test)
IF "%A%"=="70" (echo test)
Второй вариант с кавычками безопаснее, если сравниваете строки.

Переменную можно не раскрывать только в математических операциях при участии оператора set /a
 
Заметил несколько ошибок:

>> Логическое отрицание (Logical NOT)
CMD/BATCH:
set /a y="!"%x%
дает результат (%y%) 1 (True), если переменная(%x%) равна 0 (False),
и 0 (False) (%y%) в любых других случаях

>> Побитовая инверсия (Bitwise NOT)
>> Может неправильно инвертировать знаковый бит
CMD/BATCH:
set /a y="~"%x%
дает результат -1-%x% (%y%)

>> Унарный минус (устанавливает/сбрасывает знаковый бит)
Отрицание
CMD/BATCH:
set /a y="-"%x%
дает результат 0-%x% (%y%)

Эти операции, как и все остальные, поддерживают кавычный синтаксис:
CMD/BATCH:
set /a "y=!%x%"
set /a "y=~%x%"
set /a "y=-%x%"
 
Второй вариант с кавычками безопаснее, если сравниваете строки.
Оператор == используется только для строчного сравнения. Кавычки необходимы если в переменной/операнде имеются пробелы.
Для арифметического сравнения необходимо использовать арифметические операторы:
EQU : Равно (=)
NEQ : Не равно (!=)
LSS : Меньше (<)
LEQ : Меньше или равно (<=)
GTR : Больше (>)
GEQ : Больше или равно (>=)
Использовать операторы из скобок не представляется возможным, потому что, например, операторы < и > являются указателями перенаправления ввода-вывода.
 
Последнее редактирование:
При использовании нетривиальных вычислений. Например, в случае переполнения при использовании операторов битового сдвига. Эти операторы просто не определяют переполнение, вследствие чего последующая побитовая инверсия даёт ошибочный результат.

ЗЫ. Только не просите примеры, они где то далеко и глубоко закопаны :) Да Вы и сами можете исследовать эту особенность, это несложно ;)
ЗЫЫ. Любой, кто использует вычисления подобного рода в командной оболочке, способен самостоятельно расследовать подобные инциденты, выявить причину ошибочных результатов, и принять меры, чтобы избежать этих инцидентов. Я привёл тот комментарий лишь для информативности: знание - сила. Можете игнорировать его, если он Вас каким-либо образом напрягает.
 
Последнее редактирование:
Да, верю. Я проверил побитовую инверсию на максимальных числах и у меня всё посчитало правильно.
Но если речь о битовых сдвигах, ещё и переполнении, то тогда всё понятно.

Вот в копилку ещё:
если разница между операндами при арифметическом сравнении чисел составляет 2147483647 (Max Int),
результат операции переворачивается (кроме операций EQU, NEQ).
Пример: Rules for how CMD.EXE parses numbers - Page 3 - DosTips.com
 
Последнее редактирование:
Точно так же как и в обычной математике (остаток от деления). Входные данные - целочисленные. Результат - оставшаяся часть числа, которую не удаётся разделить нацело.
Код:
set /a xy=5 % 3
echo %xy%
Результат в переменной xy.

Если записываете в формате батника, то % нужно удваивать %%.
 
Последнее редактирование:
Привет. Спасибо за инфу о CMD, многое почерпнул, продолжаю изучать.
Хочу добавить, вроде не было:
Два символа сначала из последних трех %var:~-3,2% 78
Без последних двух символов из последних трех %var:~-3,-2% 7
 
Назад
Сверху Снизу