batch-file
Переменные в пакетных файлах
Поиск…
декларация
Чтобы создать простую переменную и присвоить ее значению или строке, используйте команду SET
:
SET var=10
Здесь код объявляет новую переменную var
со значением 10
. По умолчанию все переменные хранятся внутри строки в виде строк; это означает, что значение 10
не отличается от foo1234
или Hello, World!
Заметки о кавычках
Используемые котировочные знаки будут включены в значение переменной:
SET var="new value" <-- %var% == '"new value"'
Пространства в переменных
Пакетный язык рассматривает пространства как приемлемые части имен переменных. Например, set var = 10
приведет к переменной var
которая содержит значение 10
(обратите внимание на дополнительное пространство справа от var и слева от 10).
Использование кавычек для устранения пробелов
Чтобы предотвратить пробелы, используйте кавычки вокруг всего задания; имя переменной и значение. Это также предотвращает случайные конечные пробелы в конце строки (символ ␣
обозначает пробел):
SET␣var=my␣new␣value␣ <-- '%var%' == 'my new value '
SET␣"var=my␣new␣value"␣ <-- '%var%' == 'my new value'
Кроме того, используйте кавычки при объединении нескольких операторов с помощью &
или |
- альтернативно, поместите символ непосредственно после окончания значения переменной:
SET var=val & goto :next <-- '%var%' == 'val '
SET "var=val" & goto :next <-- '%var%' == 'val'
SET var=val& goto :next <-- '%var%' == 'val'
использование
echo %var%
Этот код будет повторять значение var
Если используется setLocal EnableDelayedExpansion
, следующее будет setLocal EnableDelayedExpansion
значение var
(стандартное выражение% var% не будет работать в этом контексте).
echo !var!
В пакетных файлах переменные могут использоваться в любом контексте, в том числе в составе команд или частей других переменных. Вы не можете вызывать переменную до ее определения.
Использование переменных в качестве команд:
set var=echo
%var% This will be echoed
Использование переменных в других переменных:
set var=part1
set %var%part2=Hello
echo %part1part2%
Переменная замена
В отличие от других языков программирования, в пакетном файле переменная заменяется ее фактическим значением до запуска командного скрипта. Другими словами, замена выполняется, когда скрипт считывается в память командным процессором, а не при последующем запуске сценария.
Это позволяет использовать переменные как команды внутри скрипта и как часть других имен переменных в скрипте и т. Д. «Сценарий» в этом контексте является строкой или блоком кода, окруженным круглыми скобками: ()
.
Но это поведение означает, что вы не можете изменить значение переменной внутри блока!
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
ECHO %VAR%
SET VAR=Goodbye
)
распечатает
Hello
Hello
поскольку (как вы видите, при просмотре сценария, запускаемого в окне команд), он вычисляется так:
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
echo Hello
SET VAR=Goodbye
)
В приведенном выше примере команда ECHO
оценивается как Hello
когда скрипт считывается в память, поэтому скрипт будет эхом Hello
навсегда, однако многие проходы выполняются через скрипт.
Способ достижения более «традиционного» поведения переменной (переменной, которая расширяется во время работы скрипта) заключается в том, чтобы включить «замедленное расширение». Это включает в себя добавление этой команды в скрипт перед инструкцией цикла (обычно цикл FOR, в пакетном скрипте) и использование восклицательного знака (!) Вместо знака процента (%) в имени переменной:
setlocal enabledelayedexpansion
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
echo !VAR!
SET VAR=Goodbye
)
endlocal
распечатает
Hello
Goodbye
Синтаксис %%a in (1,1,2)
заставляет цикл работать 2 раза: в первом случае переменная несет свое начальное значение «Hello», но на втором проходе через цикл - выполнив второй SET как последнее действие на 1-м проходе - это изменилось на измененное значение «До свидания».
Расширенная подстановка переменных
Теперь, передовая техника. Использование команды CALL
позволяет процессору команд партии расширять переменную, расположенную в той же строке сценария. Это может обеспечить многоуровневое расширение путем повторного использования CALL и модификатора.
Это полезно, например, для цикла FOR. Как и в следующем примере, где у нас есть нумерованный список переменных:
"c:\MyFiles\test1.txt" "c:\MyFiles\test2.txt" "c:\MyFiles\test3.txt"
Мы можем достичь этого, используя следующий цикл FOR:
setlocal enabledelayedexpansion
for %%x in (%*) do (
set /a "i+=1"
call set path!i!=%%~!i!
call echo %%path!i!%%
)
endlocal
Выход:
c:\MyFiles\test1.txt
c:\MyFiles\test2.txt
c:\MyFiles\test3.txt
Обратите внимание, что переменная !i!
сначала расширяется до его начального значения, 1, то результирующая переменная% 1 расширяется до ее фактического значения c:\MyFiles\test1.txt
. Это двойное расширение переменной i
. На следующей строке i
снова удваивается, используя команду CALL ECHO
вместе с префиксом переменной %%
, затем печатается на экране (т.е. отображается на экране).
На каждом последующем проходе через цикл начальное число увеличивается на 1 (из-за кода i+=1
). Таким образом, он увеличивается до 2
на 2
-м проходе через петлю и до 3
на 3
-м проходе. Таким образом, строка, отобранная на экран, изменяется с каждым проходом.
Объявить несколько переменных
Когда в начале партии задано несколько переменных, можно использовать короткую форму определения, используя заменяющую строку.
@echo off
set "vars=_A=good,_B=,_E=bad,_F=,_G=ugly,_C=,_H=,_I=,_J=,_K=,_L=,_D=6
set "%vars:,=" & set "%"
for /f %%l in ('set _') do echo %%l
exit /b
_A=good
_D=6
_E=bad
_G=ugly
Обратите внимание, что в приведенном выше примере переменные упорядочиваются в алфавитном порядке при печати на экран.
Использование переменной как массива
Можно создать набор переменных, которые могут действовать подобно массиву (хотя они не являются фактическим объектом массива), используя пробелы в инструкции SET
:
@echo off
SET var=A "foo bar" 123
for %%a in (%var%) do (
echo %%a
)
echo Get the variable directly: %var%
Результат:
A
"foo bar"
123
Get the variable directly: A "foo bar" 123
Также можно объявить переменную с помощью индексов, чтобы вы могли получить определенную информацию. Это создаст несколько переменных с иллюзией массива:
@echo off
setlocal enabledelayedexpansion
SET var[0]=A
SET var[1]=foo bar
SET var[2]=123
for %%a in (0,1,2) do (
echo !var[%%a]!
)
echo Get one of the variables directly: %var[1]%
Результат:
A
foo bar
123
Get one of the variables directly: foo bar
Обратите внимание, что в приведенном выше примере вы не можете ссылаться на var
не указывая, что такое желаемый индекс, потому что var
не существует в своем собственном. Этот пример также использует setlocal enabledelayedexpansion
в сочетании с восклицательными знаками в !var[%%a]!
, Вы можете просмотреть дополнительную информацию об этом в документах с переменной заменой .
Операции над переменными
set var=10
set /a var=%var%+10
echo %var%
Конечное значение var
равно 20.
Вторая строка не работает в командном блоке, используемом, например, в условии IF или в цикле FOR, поскольку требуется замедленное расширение вместо стандартного расширения переменной среды.
Вот еще один лучший способ работы в командном блоке:
set var=10
set /A var+=10
echo %var%
Среда командной строки поддерживает с подписанными 32-битными целыми значениями:
- дополнение
+
и+=
- вычитание
-
и-=
- умножение
*
и*=
- деление
/
и/=
- модульное деление
%
и%=
- побитовое И
&
- побитовое ИЛИ
|
- побитовое НЕ
~
- побитовое XOR
^
- побитовый сдвиг влево
<<
- побитовый сдвиг вправо
>>
- логическое НЕ
!
- унарный минус
-
- группировка с
(
и)
Командный интерпретатор Windows не поддерживает 64-разрядные целочисленные значения или значения с плавающей запятой в арифметических выражениях.
Примечание . Оператор %
должен быть записан в пакетном файле как %%
который должен интерпретироваться как оператор.
В окне командной строки, выполняющем set /A Value=8 % 3
командной строки set /A Value=8 % 3
присваивается значение 2
переменной среды Value
и дополнительно выводится 2
.
В пакетном файле необходимо записать set /A Value=8 %% 3
чтобы присвоить значение 2
переменной окружения Value
и ничего не выводится, соответственно, для обработки STDOUT (стандартный вывод). Набор строк set /A Value=8 % 3
в пакетном файле приведет к появлению сообщения об ошибке Отсутствует оператор при выполнении командного файла.
Для среды требуется коммутатор /A
для арифметических операций, а не для обычных строковых переменных.
Каждая строка в арифметическом выражении после set /A
означает, что число или оператор автоматически интерпретируются как имя переменной среды.
По этой причине ссылка на значение переменной с %variable%
или !variable!
не требуется, когда имя переменной состоит только из словных символов (0-9A-Za-z_), причем первый символ не является цифрой, что особенно полезно в командном блоке, начиная с (
и заканчивая сопоставлением )
.
Числа преобразуются из строки в целое число с функцией C / C ++ strtol с base
, равной нулю, что означает автоматическое определение базы, что может легко привести к неожиданным результатам.
Пример:
set Divided=11
set Divisor=3
set /A Quotient=Divided / Divisor
set /A Remainder=Divided %% Divisor
echo %Divided% / %Divisor% = %Quotient%
echo %Divided% %% %Divisor% = %Remainder%
set HexValue1=0x14
set HexValue2=0x0A
set /A Result=(HexValue1 + HexValue2) * -3
echo (%HexValue1% + %HexValue2%) * -3 = (20 + 10) * -3 = %Result%
set /A Result%%=7
echo -90 %%= 7 = %Result%
set OctalValue=020
set DecimalValue=12
set /A Result=OctalValue - DecimalValue
echo %OctalValue% - %DecimalValue% = 16 - 12 = %Result%
Результат этого примера:
11 / 3 = 3
11 % 3 = 2
(0x14 + 0x0A) * -3 = (20 + 10) * -3 = -90
-90 %= 7 = -6
020 - 12 = 16 - 12 = 4
Переменные, не определенные при оценке арифметического выражения, заменяются значением 0.
Установка переменных из ввода
Используя переключатель /p
с помощью команды SET
вы можете определить переменные из ввода.
Этот вход может быть пользователем Вход (клавиатура):
echo Enter your name :
set /p name=
echo Your name is %name%
Который может быть упрощен следующим образом:
set /p name=Enter your name :
echo Your name is %name%
Или вы можете получить входные данные из файла:
set /p name=< file.txt
в этом случае вы получите значение первой строки из file.txt
Получение значения различной строки в файле:
(
set /p line1=
set /p line2=
set /p line3=
) < file.txt