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

Тема в разделе "FAQ по Пакетным файлам CMD/BAT", создана пользователем Dragokas, 2 ноя 2013.

  1. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.498
    Симпатии:
    4.313

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

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

    Вручную
    Код (DOS):
    set x=stroka
    set /a y=55
    Ввод с клавиатуры
    Код (DOS):
    set /p x="BBeduTe cTpoky: "
    Типы переменных

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

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

    Вывод значения переменных
    Код (DOS):
    echo %x%
    Существующие переменные

    %RANDOM% - раскрывается в случайное десятичное число между 0 и 32767.(от 0 до (2^17)-1)
    Код (DOS):
    set /a random10=%random%/3277
    Выводит случайное число от 0 до 9.
    У меня это число по нелепой псевдослучайности цифру секунды
    %CD% - раскрывается в строку текущей директории.
    %DATE% - раскрывается в текущую дату, используя тот же формат команды DATE.
    %TIME% - раскрывается в текущую дату, используя формат команды TIME.
    %ERRORLEVEL% - раскрывается в текущее значение ERRORLEVEL.
    Уровень ошибки, 0 - это нет ошибки, 1 - это есть ошибка, а другие это номера ошибки.

    Чтобы получить полный список переменных и их значений введите команду SET


    Операции со строковыми или численными переменными

    Соединение 2-ух строковых переменных
    Код (DOS):
    set x=Gaz
    set y=Prom
    echo %x%%y%
    (GazProm)
    Вывод определенного(ых) символа(ов) из строки
    Символы номеруются начиная с 0!

    Код (DOS):
    set str=babywka
    Вывод 1-ого символа
    Код (DOS):
    echo %str:~0,1%
    (b)
    Вывод 3-х символов с конца строки
    Код (DOS):
    echo %str:~-3%
    (wka)
    Вывод всей строки кроме 2-ух первых символов
    Код (DOS):
    echo %str:~2%
    (bywka)
    Вывод всей строки кроме 2-ух последних символов
    Код (DOS):
    echo %str:~0,-2%
    (babyw)
    Вывод 3-х символов начиная с 3
    Код (DOS):
    echo %str:~2,3%
    (byw)
    Удаление подстроки из строки
    Код (DOS):
    set str=babywka
    echo %str:ba=%
    (bywka)
    Замена подстроки из строки на другую подстроку
    Код (DOS):
    set str=babywka
    echo %str:bab=xlop%
    (xlopywka)
    Удаление кавычек(") из строки
    Код (DOS):
    set str2="qwerty"
    echo %str2:"=%
    (qwert)
    В данном случае: если кавычки в начале и конце строки - можно юзать
    Код (DOS):
    echo %str2:~1,-1%
    (qwert)
    Существуют 2 способа использовать переменную в переменной, например: вывод n-ого символа

    Первый способ с call set
    Код (DOS):
    call set x=%%str:~%n%,1%%
    echo %x%
    Второй способ с for и setlocal enabledelayedexpansion
    Код (DOS):
    setlocal enabledelayedexpansion
    for /l %%i in (%n%,1,%n%) do (set x=!str:~%%i,1!)
    echo %x%
    тут неважно что в for писать, главное
    Код (DOS):
    set x=!str:~%n%,1!
    писать в do
    С циклами мы разберемся в следующей статье.
    Но, пока уточню: если код второго способа юзать в пакетном файле (BATнике), то вместо %i юзаем %%i.


    Операции с числовыми переменными

    Увеличивание на единицу
    Код (DOS):
    set /a x+=1
    Увеличивание в 2 раза
    Код (DOS):
    set /a x+=%x%
    аналогично
    Код (DOS):
    set /a x*=2
    Возведение в квадрат
    Код (DOS):
    set /a x*=%x%
    Возведение в куб
    Код (DOS):
    set /a x=%x%*%x%*%x%
    Деление
    Деление в CMD является целочисленным!(то есть делится до целого числа)
    Код (DOS):
    set /a x=15
    set /a y=4
    set /a xy=%x%/%y%
    (3)
    Сложение
    Код (DOS):
    set /a x=5
    set /a y=-6
    set /a xy=%x%+%y%
    (5+(-6)=5-6=-1)
    Вычитание
    Код (DOS):
    set /a x=5
    set /a y=-6
    set /a xy=%x%-%y%
    (5-(-6)=5+6=11)
    Вычисление остатка
    Код (DOS):
    set /a xy=%x% "%" %y%
    Унарные операторы
    (Не знаю, как они называются)

    Код (DOS):
    set /a y="!"%x%
    дает результат(%y%) 1, если переменная(%x%) равна 0, и 0 (%y%) в любых других случаях
    Код (DOS):
    Например
    set /a x=5
    set /a y="!"%x%
    (0)
    set /a x=0
    set /a y="!"%x%
    (1)
    Код (DOS):
    set /a y="~"%x%
    дает результат -1-%x% (%y%)
    Например
    Код (DOS):
    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)
    Отрицание
    Код (DOS):
    set /a y="-"%x%
    дает результат 0-%x% (%y%)
    Например
    Код (DOS):
    set /a x=5
    set /a y="-"%x%
    (-5)
    set /a x=-3
    set /a y="-"%x%
    (3)
    Двоичные операторы
    Код (DOS):
    set x=3
    (в двоичной системе счисления - 0011)
    set y=5
    (в двоичной системе счисления - 0101)
    Побитовое И (AND)

    Побитовое И — это бинарная операция, действие которой эквивалентно применению логического И к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.
    Другими словами, если оба соответствующих бита операндов равны 1, результирующий двоичный разряд равен 1; если же хотя бы один бит из пары равен 0, результирующий двоичный разряд равен 0.

    Код (DOS):
    set /a xy=%x%"&"%y%
    (1, в двоичной системе счисления - 0001)
    Побитовое ИЛИ (OR)

    Побитовое ИЛИ — это бинарная операция, действие которой эквивалентно применению логического ИЛИ к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.
    Другими словами, если оба соответствующих бита операндов равны 0, двоичный разряд результата равен 0; если же хотя бы один бит из пары равен 1, двоичный разряд результата равен 1.

    Код (DOS):
    set /a xy=%x%"|"%y%
    (7, в двоичной системе счисления - 0111)
    Побитовое исключающее ИЛИ (XOR)

    Побитовое исключающее ИЛИ (или побитовое сложение по модулю два) — это бинарная операция, действие которой эквивалентно применению логического исключающего ИЛИ к каждой паре битов, которые стоят на

    одинаковых позициях в двоичных представлениях операндов.
    Другими словами, если соответствующие биты операндов различны, то двоичный разряд результата равен 1; если же биты совпадают, то двоичный разряд результата равен 0.

    Код (DOS):
    set /a xy=%x%"^"%y%
    (6, в двоичной системе счисления - 0110)
    К битовым операциям также относят битовые сдвиги. При сдвиге значения битов копируются в соседние по направлению сдвига.
    Различают сдвиг влево (в направлении от младшего бита к старшему) и вправо (в направлении от старшего бита к младшему).
    При логическом сдвиге значение последнего бита по направлению сдвига теряется (копируясь в бит переноса), а первый приобретает нулевое значение.

    Двоичный арифметический сдвиг

    Арифметический сдвиг аналогичен логическому, но значение слова считается знаковым числом, представленным в дополнительном коде.
    Так, при правом сдвиге старший бит сохраняет свое значение. Левый арифметический сдвиг идентичен логическому.

    Вправо
    Код (DOS):
    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))
    Влево
    Код (DOS):
    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 не используются.

    Восьмеричная система счисления
    Код (DOS):
    set /a x=022
    (Это 22 в восьмеричной системе счисления, и 18 в десятичной)
    Можно производить все операции, также как и с десятеричными числами.
    Но после задания значения переменной, значение хранится в десятичной системе счисления.
    Например, сложение
    Код (DOS):
    set /a xy=022+07
    (Это 22+7=31 в восьмеричной системе счисления, и 31 в десятичной)
    Шестнадцатеричная система счисления
    Код (DOS):
    set /a x=0x3A
    (Это 3A в восьмеричной системе счисления, и 58 в десятичной)
    Вычитание
    Код (DOS):
    set /a xy=0x3A-0x66
    (Это 3A-66=-54 в восьмеричной системе счисления, и -44 в десятичной)
    Сохранение в переменной вывода программы
    К сожаление, передача вывода программ на вход команды set не работает:
    Код (DOS):
    echo 1|set /p AA=""
    set AA
    Поэтому можно воспользоваться временным сохранением в файл:
    Код (DOS):
    echo 1> 0.tmp
    set /p AA="" <0.tmp
    del 0.tmp
    echo %AA%
    Примеры использования
    Узнать динамически генерируемое имя архива WinRar:
    Код (DOS):
    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
    Узнать имя последнего изменённого файла в папке:
    Код (DOS):
    dir /b /a-d /o-d *.* >%temp%\0.tmp
    set /p lastfile="" <%temp%\0.tmp
    del %temp%\0.tmp
    echo "%lastfile%"
    Комментарий от Dragokas :
    По сути эта команда считывает в переменную первую строку файла:
    Код (DOS):
    set /p stroka=<file.txt
     
    Последнее редактирование: 3 ноя 2013
    Alex1983, glax24 и Kиpилл нравится это.
  2. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.498
    Симпатии:
    4.313
    Урезание части строки, замена значения в переменной:
    Var_Replacing.png
    Код (DOS):
    @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
    Вывод текста без переноса на новую строку
    Код (DOS):
    @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 (пробел).
    Код (DOS):
    @echo off
    echo %__CD__%
    echo %=C:%
    set "decimal=%1"
    cmd /c exit /b  %decimal%
    echo ASCII(как символ) exitcode: %=ExitCodeAscii%
    echo Hex exitcode: %=ExitCode%
    pause
     
    Последнее редактирование: 3 ноя 2013
    Kиpилл нравится это.
  3. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.498
    Симпатии:
    4.313
    Полезные функции

    Арифметика:

    Получить уникальное имя файла во временной папке
    Код (DOS):
    @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? Вот решение:
    Код (DOS):
    @Echo Off
    SetLocal
    set min=-50
    set max=50
    set /a i=%random%%%(max-min+1)+min
    Echo:%i%
    pause>nul
    Вычисление степени числа
    Подпрограмма и пример использования:
    Код (DOS):
    @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
    Деление с выведением дробной части
    Как известно в бат-файлах есть только операция целочисленного деления
    и получения остатка от деления. Получить дробное число нельзя. Решил восполнить этот пробел:
    Код (DOS):
    ::Деление с выводом дробной части на батниках - 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
    (актуально для Гигабайтов данных, представленных в виде байтов, для дальнейшего перевода в более удобо-читаемую единицу измерения).

    Код (DOS):
    :: Деление через строковую математику - 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
    Пример использования:
    Код (DOS):
    @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
    Код (DOS):
    :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.
    Код (DOS):
    @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. Простой вариант - проверка на содержимое в строке заданной подстроки
    Код (DOS):
    set a=qwerty
    if "%a:ty=%" neq "%a%"  echo "ty" present in string
    Принцип работы: если подстрока присутствует в строке, она будет удалена и результат не будет равен исходной строке.
    Не работает с пустыми строками.

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

    Код (DOS):
    @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-й строки:
    Код (DOS):
    <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)
    Код (DOS):
    for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H# & echo on & for %%A in (1) do rem"') do set "DEL=%%a"
     
    Последнее редактирование: 29 дек 2013
    Kиpилл нравится это.

Поделиться этой страницей