
Начало области задания для определения переменных среды в пакетном файле. Локальное окружение
используется до тех пор, пока не встретится команда endlocal или не будет достигнут
конец пакетного файла.
Начало области задания для определения переменных среды в пакетном файле. Локальное окружение
используется до тех пор, пока не встретится команда endlocal или не будет достигнут
конец пакетного файла.
Нужен BAT для скриншота, нумерации, и работа с папкой.
Пример:
– Сперва создаётся скриншот в папке, формата .png, далее, идёт нумерация: screenshot_0.png, screenshot_1.png, и т.д.
– Если например, сделано скриншотов 10 шт, далее, если нужно удалить или переместить такой порядок номер скриншотов: 1, 2, 3, 4, 5, и после 5 остались файлы с номером: 6, 7, 8, 9, 10, то нумерация идёт дальше от 10, так как screenshot_10.png последний снимок в папке с номером 10, и нумеруется так: 11, 12, 13, 14, и т.д.
– Если отсутствуют например, снимки с номером: 6, 7, 8, 9, 10, а остались 1, 2, 3, 4, 5, то нумерация идёт дальше от 5, так как screenshot_5.png последний снимок в папке с номером 5, и нумеруется так: 6, 7, 8, 9, и т.д.
– Когда есть такой порядок: 1, 2, 3, 6, 7, 8, например, то нумерация идёт дальше от 8, так как screenshot_8.png последний снимок в папке с номером 8, и нумеруется так: 9, 10, 11, 12, и т.д.
– Если будут все удалены или просто перемещены файлы .png из папки куда сохраняются скриншоты, то нумерация снова идёт заново с 0, и т.д.
– Скриншоты с нумерацией файлов сохраняются в отдельную папку, например, “скриншоты”, в папке программы C:\Прога\скриншоты
– При отсутствии папки “скриншоты”, происходит проверка, BAT определяет на отсутствие папки, если её нет в папке программы, то один раз её создаст. Это действие выполняется первым.
– Скриншоты с папкой и программой работают вне зависимости директории Windows.
– Когда BAT выполнит свой скрипт, он закроется при завершении.
Сможете помочь это сделать?
// Замечание модератора. Текст отредактирован по просьбе автора.
In batch variables are expanded by enclosing them in percent signs.
set myVariable=Hello world
echo %myVariable%That means variable expansion.
Compared to other programming languages, batch don’t really work with variables.
Normally it works only with the expansion of them.
It works like the macro expansion of C/C++.
So there doesn’t exist a string length function to get the length of a variable,
but you can write a function that counts the characters of text.
Explanation of setLocal EnableDelayedExpansion
The normal percent expansion has two disadvantages.
Lets see this sample
set var=one
set var=two & echo %var%
echo %var%The output will be
one
two
And the second disadvantage is that the batch parser will parse the expanded result of the variable.
set var=cat^&dog
echo %var%var
Unknown command “dog”
But the percent expansion exists since the beginning of MS-Dos (1920 or so).
The DelayedExpansion adds a new expansion character, the exclamation mark !.
But you have to active it first to use it with setlocal EnableDelayedExpansion, this is for compatibility reasons to old programs.
setlocal EnableDelayedExpansion
set var=one
set var=two & echo !var!
set var=cat^&dog
echo !var!two
cat&dog
So this solves both problems of the percent expansion.
Delayed Expansion on the command line
You can’t enable it by setlocal EnableDelayedExpansion, on the command line it has no effect at all.
But you can use cmd /v:on
set "var=Cat & dog" & cmd /V:on /c echo !var!Cannot retrieve contributors at this time
Starts localization of environment variables in a batch file. Localization continues until a matching endlocal command is encountered or the end of the batch file is reached.
Syntax
setlocal [enableextensions | disableextensions] [enabledelayedexpansion | disabledelayedexpansion]Parameters
Remarks
If you use setlocal outside of a script or batch file, it has no effect.
Use setlocal to change environment variables when you run a batch file. Environment changes made after you run setlocal are local to the batch file. The Cmd.exe program restores previous settings when it encounters an endlocal command or reaches the end of the batch file.
You can have more than one setlocal or endlocal command in a batch program (that is, nested commands).
- nul
setlocal enableextensions
if errorlevel 1 echo Unable to enable extensions”>verify other 2>nul setlocal enableextensions if errorlevel 1 echo Unable to enable extensions
Examples
endlocal
start notepad c:\superapp.out”>
rem *******Begin Comment**************
rem This program starts the superapp batch program on the network,
rem directs the output to a file, and displays the file
rem in Notepad.
rem *******End Comment**************
@echo off
setlocal
path=g:\programs\superapp;%path%
call superapp>c:\superapp.out
endlocal
start notepad c:\superapp.outRelated links
<!– –>
Set options to control the visibility of environment variables in a batch file.
SETLOCAL on it’s own, usually at the start of a batch file, will begin localisation of Environment Variables.
Issuing a SETLOCAL command, the batch script will inherit all current variables from the master environment/session.
Issuing an ENDLOCAL command will restore any environment variables present before the SETLOCAL was issued.
If a batch script does not use SETLOCAL then all variables will be Global, i.e. visible and modifiable by other scripts.
Although global variables are easy to work with they are not good practice – for example if you have several batch scripts dealing with filenames (and these scripts are CALLing one another), the first script has a variable called _filename, the second script a different variable called file-name (a different name to avoid conflicting with the first script) a third script now needs something like file_name this quickly becomes very difficult to manage.
With local variables you are free to use the same variable names in multiple batch scripts – there is no conflict because the local variables are not visible to any other script.
Local Variables can be passed from one batch routine to another with the ENDLOCAL command.
EnableDelayedExpansion
Setting EnabledDelayedExpansion will cause each variable to be expanded at execution time rather than at parse time.
DisableDelayedExpansion
Setting DisabledDelayedExpansion will cause each variable to be expanded at parse time rather than at execution time, this is the default behaviour.
Overloading a variable:
SETLOCAL can be used more than once in the same batch file so that multiple values can be stored in the same Environment Variable. To keep track of variable definitions, pair each SETLOCAL with a corresponding ENDLOCAL.
SETLOCAL is limited to 32 active instantiations per CALL level. At the root level a script can have up to 32 active SETLOCAL, and then CALL a subroutine that gets its own allocation of up to 32 SETLOCAL, etc.
ErrorLevel
When run from a batch file, SETLOCAL will always set an ERRORLEVEL.
If given a valid argument or no arguments, a new environment is created %ERRORLEVEL% = 0
If bad parameters given, %ERRORLEVEL% = 1
EnableExtensions / DisableExtensions
Command Extensions are enabled by default, there is rarely any need to disable them.
If Command Extensions are permanently disabled or if a script is running under the Windows 95 command processor command.com then SETLOCAL ENABLEEXTENSIONS will not be able to restore them.
A batch file to warn if command extensions are not available (see forum thread):
SETLOCAL is an internal command.
Sources:
Phase 5 in How does the Windows Command Interpreter (CMD.EXE) parse scripts?
- Each token for a command is parsed for delayed expansion independently.
- Most commands parse two or more tokens – the command token, the arguments token, and each redirection destination token.
- The FOR command parses the IN clause token only.
- The IF command parses the comparison values only – either one or two, depending on the comparison operator.
- For each parsed token, first check if it contains any
!. If not, then the token is not parsed – important for^characters.
If the token does contain!, then scan each character from left to right:- If it is a caret (
^) the next character has no special meaning, the caret itself is removed - If it is an exclamation mark, search for the next exclamation mark (carets are not observed anymore), expand to the value of the variable.
- Consecutive opening
!are collapsed into a single! - Any remaining unpaired
!is removed
- Consecutive opening
- Expanding vars at this stage is “safe”, because special characters are not detected anymore (even
<CR>or<LF>) - For a more complete explanation, read the 2nd half of this from dbenham
same thread – Exclamation Point Phase
- If it is a caret (
Phase 5.3) Pipe processing: Only if commands are on either side of a pipe
Each side of the pipe is processed independently and asynchronously.
- If command is internal to cmd.exe, or it is a batch file, or if it is a parenthesized command block, then it is executed in a new cmd.exe thread via
%comspec% /S /D /c" commandBlock", so the command block gets a phase restart, but this time in command line mode.- If a parenthesized command block, then all
<LF>with a command before and after are converted to<space>&. Other<LF>are stripped.
- If a parenthesized command block, then all
- This is the end of processing for the pipe commands.
- See https://stackoverflow.com/q/8192318/1012053 for more about pipe parsing and processing
Phase 5.5) Execute Redirection: Any redirection that was discovered in phase 2 is now executed.
- The results of phases 4 and 5 can impact the redirection that was discovered in phase 2.
- If the redirection fails, then the remainder of the command is aborted. Note that failed redirection does not set ERRORLEVEL to 1 unless
||is used.

- You can also use the
Delayed Expansionbycmd.exewith flag[/v:on | /v], on the command-line or in the bat/cmd files.

- In your command-line using
cmd.exe /v:on /c
set ar[0]=orange
set ar[1]=apple
set ar[2]=banana
for %i in (0,1,2) do cmd.exe /v:on /C"echo !ar[%i]!- In your bat/cmd file without declaring
setlocal enabledelayedexpansion, you can also usecmd.exe /v:on /c "command & command | command || command..."
@echo off
set "ar[0]=orange"
set "ar[1]=apple"
set "ar[2]=banana"
for %%i in (0,1,2)do cmd /v /c "echo\ !ar[%%i]!"- In your bat/cmd declaring
setlocal enabledelayedexpansion:
@echo off
set "ar[0]=orange"
set "ar[1]=apple"
set "ar[2]=banana"
setlocal enabledelayedexpansion
for %%i in (0,1,2)do echo\ !ar[%%i]!
enndlocal- Some layout variances for this bat/cmd code:
@echo off
set "ar[0]=orange" & set "ar[1]=apple" & set "ar[2]=banana"
for %%i in (0,1,2)do %ComSpec% /v:on /c"echo !ar[%%i]!"%__APPDIR__%timeout.exe /t -1 & endlocal & goto :EOF@echo off
set "ar[0]=orange" & set "ar[1]=apple" & set "ar[2]=banana"
setlocal enabledelayedexpansion && for %%i in (0,1,2)do echo\ !ar[%%i]!
%__APPDIR__%timeout.exe /t -1 & endlocal & goto :EOF@echo off
set "ar[0]=orange" && set "ar[1]=apple" && set "ar[2]=banana"
for %%i in (0,1,2)do <con: %ComSpec% /v:on /c"echo !ar[%%i]!"
call <con: rem./ && %__APPDIR__%timeout.exe /t -1 && endlocal- You also can use
callin bat/cmd or in your command-line to update this value:
set "ar[0]=orange"
set "ar[1]=apple"
set "ar[2]=banana"
for %i in (0,1,2)do for %i in (0,1,2)do <con: call echo %ar[%i]%- In your bat/cmd file or command line, all the following commands are the same, observing replacing
%iwith%%iin the case of use in bat/cmd files
for %i in (0,1,2) do %ComSpec% /v:on /r "echo !ar[%i]!"
for %i in (0,1,2) do %ComSpec% /v:on /c "echo !ar[%i]!"
for %i in (0,1,2) do cmd.exe /v:on /r "echo !ar[%i]!"
for %i in (0,1,2) do cmd.exe /v:on /c "echo !ar[%i]!"
for %i in (0,1,2) do cmd /v:on /r "echo !ar[%i]!"
for %i in (0,1,2) do cmd /v:on /c "echo !ar[%i]!"
for %i in (0,1,2) do %ComSpec% /v /r "echo !ar[%i]!"
for %i in (0,1,2) do %ComSpec% /v /c "echo !ar[%i]!"
for %i in (0,1,2) do cmd.exe /v /r "echo !ar[%i]!"
for %i in (0,1,2) do cmd.exe /v /c "echo !ar[%i]!"
for %i in (0,1,2) do cmd /v /r "echo !ar[%i]!"
for %i in (0,1,2) do cmd /v /c "echo !ar[%i]!"
for %i in (0,1,2) do %ComSpec%/v:on/r "echo !ar[%i]!"
for %i in (0,1,2) do %ComSpec%/v:on/c "echo !ar[%i]!"
for %i in (0,1,2) do cmd.exe/v:on/r "echo !ar[%i]!"
for %i in (0,1,2) do cmd.exe/v:on/c "echo !ar[%i]!"
for %i in (0,1,2) do cmd/v:on/r "echo !ar[%i]!"
for %i in (0,1,2) do cmd/v:on/c "echo !ar[%i]!"
for %i in (0,1,2) do %ComSpec%/v/r "echo !ar[%i]!"
for %i in (0,1,2) do %ComSpec%/v/c "echo !ar[%i]!"
for %i in (0,1,2) do cmd.exe/v/r "echo !ar[%i]!"
for %i in (0,1,2) do cmd.exe/v/c "echo !ar[%i]!"
for %i in (0,1,2) do cmd/v/r "echo !ar[%i]!"
for %i in (0,1,2) do cmd/v/c "echo !ar[%i]!"
for %i in (0,1,2) do %ComSpec%/v:on/r"echo !ar[%i]!"
for %i in (0,1,2) do %ComSpec%/v:on/c"echo !ar[%i]!"
for %i in (0,1,2) do cmd.exe/v:on/r"echo !ar[%i]!"
for %i in (0,1,2) do cmd.exe/v:on/c"echo !ar[%i]!"
for %i in (0,1,2) do cmd/v:on/r"echo !ar[%i]!"
for %i in (0,1,2) do cmd/v:on/c"echo !ar[%i]!"
for %i in (0,1,2) do %ComSpec%/v/r"echo !ar[%i]!"
for %i in (0,1,2) do %ComSpec%/v/c"echo !ar[%i]!"
for %i in (0,1,2) do cmd.exe/v/r"echo !ar[%i]!"
for %i in (0,1,2) do cmd.exe/v/c"echo !ar[%i]!"
for %i in (0,1,2) do cmd/v/r"echo !ar[%i]!"
for %i in (0,1,2) do cmd/v/c"echo !ar[%i]!"
for %i in (0,1,2) do %ComSpec%/v/recho !ar[%i]!
for %i in (0,1,2) do %ComSpec%/v/cecho !ar[%i]!
for %i in (0,1,2) do cmd.exe/v/r"echo !ar[%i]!
for %i in (0,1,2) do cmd.exe/v/c"echo !ar[%i]!
for %i in (0,1,2) do cmd/v/recho !ar[%i]!
for %i in (0,1,2) do cmd/v/cecho !ar[%i]!Some further reading:

SetLocal и расширенная обработка команд
Часто встречали такую конструкцию ?
По своей сути она состоит из 3 совмещенных частей:
Что делает?
SetLocal – означает, что все переменные, объявленные внутри Batch-файла, будут локальными и после выхода из него обнуляться.
Это также оберегает от случаев, когда Вы забываете задавать начальное значение переменной.
По-умолчанию, значение переменной при инициализации
для строкового типа = пустой строке,
для числового типа = 0.
Типы переменных.
Область видимости переменной, заданной командой Set, является текущая среда интерпретатора, если батник запущен через нее (CMD.exe) (и внутри нет команды локализации SetLocal), или сессия самого батника, если двойным кликом по нему.
![]()
Сообщение от Smitis

А также дочерние процессы, запущенный после того, как переменная установлена.
Как задается?
Переменные, использованные после команды SetLocal, можно обнулить принудительно еще до выхода из Batch-файла командой:
EndLocal и знак & (амперсанд)*
Позволяет обнулить переменную B, при этом в однострочной команде после EndLocal
переменная раскрываемая через % и все еще будет содержать старое значение, поэтому может быть “переброшена” через локаль.
В конструкции вида:
переменная A получит актуальное (обнуленное) значение переменной B,
поэтому способ “переброса” значения через локаль невозможно использовать внутри циклов.
– режим расширенной обработки команд.
Что делает?
Позволяет использовать дополнительные ключи встроенных команд.
Где используется?
Как включается?
1) Задается командой
2) Через реестр (выше по ссылкам).
3) Через ключи CMD.exe, если бат-файл или команда запускается через него, а не напрямую.
Метод может использоваться в однострочных командах, а также методах Shell других ЯП.
Пример:
Commands
подразумевается путь и имя к командному файлу (bat, cmd), цикл, команда, или перечень команд, составленных по правилам формирования однострочных команд Batch.
Может быть отключена командой:
Практическая польза от отключения, как мне известно, никакой.
– режим отложенного расширения переменных среды.
Что делает?
EnableDelayedExpansion – означает возможность использовать восклицательные знаки (!variable!) для раскрытия значения переменной.
![]()
Сообщение от Elroir
В обычном случае, чтобы узнать значение переменной окружения, надо воспользоваться конструкцией %переменная%. Однако, если значение переменной меняется внутри цикла и читается там же, то для корректной работы батника, нужно использовать команду setlocal enabledelayedexpansion и вместо символа “%”, использовать символ “!”. Иначе, значение переменной в цикле будет всегда одним и тем же – таким, каким было до входа в цикл.
Обычно переменные раскрываются через знак %.
“Раскрывается” – означает, что мы получаем значение, которое хранит переменная.
Необходимость использовать знаки (!) возникает:
- внутри цикла
- под скобками
- в однострочной команде
*Здесь и далее под подразумевается один из указанных выше вариантов.
Если Вы измените значение переменной внутри конструкции,
раскрывая переменную через %, Вы получите ее старое значение (присвоенное до входа в эту конструкцию).
Новое (актуальное) значение переменной можно получить:
- раскрыв переменную через знаки (!)
- временно выйдя за пределы конструкции (например, командой Call)
- после выхода из данной конструкции (ее завершения)
Как включить возможность использовать (!):
По-умолчанию, данный режим выключен.
Включить можно:
1) командой:
3) запуском batch-файла или команд(ы) через специальный ключ CMD.exe:
Пример:
Commands
подразумевается путь и имя к командному файлу (bat, cmd), цикл, команда, или перечень команд, составленных по правилам формирования однострочных команд Batch.
Почему бы всегда не использовать этот метод вместо % ?
1) раскрытие переменной через % быстрее, чем через !
Оптимизация кода
2) при чтении данных из файла, в содержимом которого есть знаки ! и последующей записью или выводом на экран
этой информации знаки ! “глотаются”. Поэтому еще иногда используется команда отключения данного режима:
3) Когда анализируешь свой же код, удобно понимать логику работы своего алгоритма: если видишь % под циклом, то сразу понятно, что значение этой переменной под циклом не изменяется, а если и изменяется, то в этой же конструкции новое значение не используется.
Примеры практического использования:
2) Просто под скобками:
3) В однострочных командах:
Ремарка:
Принцип раскрытия переменных влияет также на изменяемые глобальные переменные, например,
time и date, которые постоянно обновляются и отображают дату и время.
После входа в конструкцию эти переменные “замораживаются”.
Чтобы получить актуальную дату/время необходимо раскрытие через знаки (!):
Переменные. Команда SET
Ввод с клавиатуры
set /p x="BBeduTe cTpoky: "Ограничение 8184 символа.
Тип число
Ограничение от -2147483647 до 2147483647.
Вывод значения переменных
%RANDOM% – раскрывается в случайное десятичное число между 0 и 32767.(от 0 до (2^17)-1)
set /a random10=%random%/3277Выводит случайное число от 0 до 9.
У меня это число по нелепой псевдослучайности цифру секунды
%CD% – раскрывается в строку текущей директории.
%DATE% – раскрывается в текущую дату, используя тот же формат команды DATE.
%TIME% – раскрывается в текущую дату, используя формат команды TIME.
%ERRORLEVEL% – раскрывается в текущее значение ERRORLEVEL.
Уровень ошибки, 0 – это нет ошибки, 1 – это есть ошибка, а другие это номера ошибки.
Чтобы получить полный список переменных и их значений введите команду SET
Операции со строковыми или численными переменными
Соединение 2-ух строковых переменных
set x=Gaz
set y=Prom
echo %x%%y%
(GazProm)Вывод определенного(ых) символа(ов) из строки
Символы номеруются начиная с 0!
Вывод 1-ого символа
Вывод 3-х символов с конца строки
Вывод всей строки кроме 2-ух первых символов
Вывод всей строки кроме 2-ух последних символов
Вывод 3-х символов начиная с 3
Удаление подстроки из строки
set str=babywka
echo %str:ba=%
(bywka)Замена подстроки из строки на другую подстроку
set str=babywka
echo %str:bab=xlop%
(xlopywka)Удаление кавычек(“) из строки
set str2="qwerty"
echo %str2:"=%
(qwert)В данном случае: если кавычки в начале и конце строки – можно юзать
echo %str2:~1,-1%
(qwert)Существуют 2 способа использовать переменную в переменной, например:
вывод n-ого символа
Первый способ с call set
call set x=%%str:~%n%,1%%
echo %x%Второй способ с for и setlocal enabledelayedexpansion
setlocal enabledelayedexpansion
for /l %%i in (%n%,1,%n%) do (set x=!str:~%%i,1!)
echo %x%тут неважно что в for писать, главное
писать в do
С циклами мы разберемся в следующей статье.
Но, пока уточню: если код второго способа юзать в пакетном файле (BATнике), то вместо %i юзаем %%i.
Операции с числовыми переменными
Увеличивание на единицу
Увеличивание в 2 раза
Возведение в квадрат
Возведение в куб
Деление
Деление в CMD является целочисленным!(то есть делится до целого числа)
set /a x=15
set /a y=4
set /a xy=%x%/%y%
(3)set /a x=5
set /a y=-6
set /a xy=%x%+%y%
(5+(-6)=5-6=-1)set /a x=5
set /a y=-6
set /a xy=%x%-%y%
(5-(-6)=5+6=11)Вычисление остатка от деления
(при записи в батник, процент “%” нужно удваивать “%%”)
Логическое отрицание (Logical NOT)
дает результат(%y%) 1 (True), если переменная(%x%) равна 0 (False), и 0 (False) (%y%) в любых других случаях
Например
set /a x=5
set /a y="!"%x%
(0)
set /a x=0
set /a y="!"%x%
(1)Побитовая инверсия (Bitwise NOT):
дает результат -1-%x% (%y%)
Например
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)Унарный минус (устанавливает/сбрасывает знаковый бит)
дает результат 0-%x% (%y%)
Например
set /a x=5
set /a y="-"%x%
(-5)
set /a x=-3
set /a y="-"%x%
(3)set x=3
(в двоичной системе счисления - 0011)
set y=5
(в двоичной системе счисления - 0101)Побитовое И (AND)
Побитовое И — это бинарная операция, действие которой эквивалентно применению логического И к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.
Другими словами, если оба соответствующих бита операндов равны 1, результирующий двоичный разряд равен 1; если же хотя бы один бит из пары равен 0, результирующий двоичный разряд равен 0.
set /a xy=%x%"&"%y%
(1, в двоичной системе счисления - 0001)Побитовое ИЛИ (OR)
Побитовое ИЛИ — это бинарная операция, действие которой эквивалентно применению логического ИЛИ к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.
Другими словами, если оба соответствующих бита операндов равны 0, двоичный разряд результата равен 0; если же хотя бы один бит из пары равен 1, двоичный разряд результата равен 1.
set /a xy=%x%"|"%y%
(7, в двоичной системе счисления - 0111)Побитовое исключающее ИЛИ (XOR)
Побитовое исключающее ИЛИ (или побитовое сложение по модулю два) — это бинарная операция, действие которой эквивалентно применению логического исключающего ИЛИ к каждой паре битов, которые стоят на
одинаковых позициях в двоичных представлениях операндов.
Другими словами, если соответствующие биты операндов различны, то двоичный разряд результата равен 1; если же биты совпадают, то двоичный разряд результата равен 0.
set /a xy=%x%"^"%y%
(6, в двоичной системе счисления - 0110) К битовым операциям также относят битовые сдвиги. При сдвиге значения битов копируются в соседние по направлению сдвига.
Различают сдвиг влево (в направлении от младшего бита к старшему) и вправо (в направлении от старшего бита к младшему).
При логическом сдвиге значение последнего бита по направлению сдвига теряется (копируясь в бит переноса), а первый приобретает нулевое значение.
Двоичный арифметический сдвиг
Арифметический сдвиг аналогичен логическому, но значение слова считается знаковым числом, представленным в дополнительном коде.
Так, при правом сдвиге старший бит сохраняет свое значение. Левый арифметический сдвиг идентичен логическому.
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))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))И я забыл, про 8-ричную и 16-ричную систему счисления в CMD
Числовые значения рассматриваются как десятичные, если перед ними не стоит префикс 0x для шестнадцатеричных чисел, и 0 для восьмеричных чисел. Например, числа 0x12, и 022 обозначают десятичное число 18.
Обратите внимание на запись восьмеричных числе: 08 и 09 не являются допустимыми числами, так как в восьмеричной системе исчисления цифры 8 и 9 не используются.
Восьмеричная система счисления
set /a x=022
(Это 22 в восьмеричной системе счисления, и 18 в десятичной)Можно производить все операции, также как и с десятеричными числами.
Но после задания значения переменной, значение хранится в десятичной системе счисления.
Например, сложение
set /a xy=022+07
(Это 22+7=31 в восьмеричной системе счисления, и 31 в десятичной)Шестнадцатеричная система счисления
set /a x=0x3A
(Это 3A в восьмеричной системе счисления, и 58 в десятичной)set /a xy=0x3A-0x66
(Это 3A-66=-54 в восьмеричной системе счисления, и -44 в десятичной)Сохранение в переменной вывода программы
К сожаление, передача вывода программ на вход команды set не работает:
echo 1|set /p AA=""
set AAПоэтому можно воспользоваться временным сохранением в файл:
echo 1> 0.tmp
set /p AA="" <0.tmp
del 0.tmp
echo %AA%Примеры использования
Узнать динамически генерируемое имя архива WinRar:
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Узнать имя последнего изменённого файла в папке:
dir /b /a-d /o-d *.* >%temp%\0.tmp
set /p lastfile="" <%temp%\0.tmp
del %temp%\0.tmp
echo "%lastfile%"set /a "y=!%x%"
set /a "y=~%x%"
set /a "y=-%x%" Оператор == используется только для строчного сравнения. Кавычки необходимы если в переменной/операнде имеются пробелы.
Для арифметического сравнения необходимо использовать арифметические операторы:
EQU : Равно (=)
NEQ : Не равно (!=)
LSS : Меньше (<)
LEQ : Меньше или равно (<=)
GTR : Больше (>)
GEQ : Больше или равно (>=)
Использовать операторы, указанные в скобках, не представляется возможным, потому что, например, операторы < и > являются указателями перенаправления ввода-вывода.
Синтаксис
setlocal {enableextension | disableextensions}
{
enabledelayedexpansion | disabledelayedexpansion}
Синтаксис
setlocal {enableextension | disableextensions}
{
enabledelayedexpansion | disabledelayedexpansion}
Примеры
Локальное изменение переменных среды в пакетном файле может быть использовано следующим
образом:
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать
раздел форума
этого сайта (требуется регистрация).
Примеры
Локальное изменение переменных среды в пакетном файле может быть использовано следующим
образом:
rem *******Начало комментария************** rem Эта программа запускает приложение superapp в сети, rem записывает вывод в файл и загружает этот файл в программу rem Блокнот. rem *******Конец комментария ************** @echo off setlocal path=g:\programs\superapp;%path% call superapp>c:\superapp.out endlocal start notepad c:\superapp.outАргументы
- enableextension
- Включает расширения командного процессора до появления соответствующей команды
endlocal, вне зависимости от состояния расширений командного процессора перед
командой setlocal. - disableextensions
- Выключает расширения командного процессора до появления соответствующей команды
endlocal, вне зависимости от состояния расширений командного процессора перед
командой setlocal. - enabledelayedexpansion
- Включает расширения переменной среды с задержкой до появления соответствующей команды
endlocal, вне зависимости от состояния расширений командного процессора перед
командой setlocal. - disabledelayedexpansion
- Выключает расширения переменных среды с задержкой до появления соответствующей команды
endlocal, вне зависимости от состояния расширений командного процессора перед
командой setlocal. - /?
- Отображает справку в командной строке.
Аргументы
- enableextension
- Включает расширения командного процессора до появления соответствующей команды
endlocal, вне зависимости от состояния расширений командного процессора перед
командой setlocal. - disableextensions
- Выключает расширения командного процессора до появления соответствующей команды
endlocal, вне зависимости от состояния расширений командного процессора перед
командой setlocal. - enabledelayedexpansion
- Включает расширения переменной среды с задержкой до появления соответствующей команды
endlocal, вне зависимости от состояния расширений командного процессора перед
командой setlocal. - disabledelayedexpansion
- Выключает расширения переменных среды с задержкой до появления соответствующей команды
endlocal, вне зависимости от состояния расширений командного процессора перед
командой setlocal. - /?
- Отображает справку в командной строке.



