Поиск…


декларация

Чтобы создать простую переменную и присвоить ее значению или строке, используйте команду 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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow