Как создать переменную в bat-файле

Обновлено: 03.07.2024

Отображает, задает или удаляет переменные среды cmd.exe. При использовании без параметров set отображает текущие настройки переменных среды.

Для этой команды требуются расширения команд, которые включены по умолчанию.

Команду set также можно запустить из консоли восстановления Windows с другими параметрами. Дополнительные сведения см. в разделе Среда восстановления Windows (WinRE).

Синтаксис

Параметры

< td>Устанавливает значение для строки ввода, введенной пользователем. < /tr>
Параметр Описание
Указывает переменную среды для установки или изменения .
Указывает строку, которая будет связана с указанной переменной среды.
/p
Определяет сообщение, запрашивающее у пользователя ввод. Этот параметр должен использоваться с параметром /p.
/a Назначает вычисляемое числовое выражение.
Задает числовое выражение.
/? Отображает справку в командной строке.

Примечания

Если расширения команд включены (по умолчанию) и вы запускаете set со значением, отображаются все переменные, начинающиеся с этого значения.

Символы < , >, | , & и ^ являются специальными символами командной оболочки, и им должен предшествовать escape-символ ( ^ ) или они должны быть заключены в кавычки при использовании в (например, «StringContaining&Symbol»). Если вы заключаете в кавычки строку, содержащую один из специальных символов, кавычки устанавливаются как часть значения переменной среды.

Используйте переменные среды для управления поведением некоторых пакетных файлов и программ, а также для управления внешним видом и работой Windows и подсистемы MS-DOS. Команда set часто используется в файле Autoexec.nt для установки переменных среды.

Если вы используете команду set без каких-либо параметров, отображаются текущие настройки среды. Эти параметры обычно включают переменные среды COMSPEC и PATH, которые используются для поиска программ на диске. Windows использует две другие переменные среды: PROMPT и DIRCMD.

Если указать значения для и , указанное значение добавляется в среду и связывается с этой переменной. Если переменная уже существует в среде, новое строковое значение заменяет старое строковое значение.

Если вы указываете только переменную и знак равенства (без ) для команды set, значение, связанное с переменной, очищается (как если бы переменной не было).

При использовании параметра /a поддерживаются следующие операторы в порядке убывания приоритета:

Если вы используете логические ( && или || ) операторы или операторы модуля (%), заключите строку выражения в кавычки. Любые нечисловые строки в выражении считаются именами переменных среды, и их значения перед обработкой преобразуются в числа. Если вы указываете имя переменной среды, которое не определено в текущей среде, назначается нулевое значение, что позволяет выполнять арифметические действия со значениями переменных среды без использования % для получения значения.

Если вы запустите set /a из командной строки вне командного сценария, он отобразит окончательное значение выражения.

Числовые значения представляют собой десятичные числа, если перед ними не стоит префикс 0× для шестнадцатеричных чисел или 0 для восьмеричных чисел. Таким образом, 0×12 совпадает с 18, что совпадает с 022.

Поддержка отложенного раскрытия переменных среды по умолчанию отключена, но вы можете включить или отключить ее с помощью команды cmd /v.

При создании пакетных файлов вы можете использовать set для создания переменных, а затем использовать их так же, как вы использовали бы пронумерованные переменные от %0 до %9. Вы также можете использовать переменные от %0 до %9 в качестве входных данных для набора.

Если вы вызываете значение переменной из пакетного файла, заключите значение в знак процента (%). Например, если ваша пакетная программа создает переменную среды с именем BAUD, вы можете использовать строку, связанную с BAUD, в качестве заменяемого параметра, введя %baud% в командной строке.

Примеры

Чтобы установить значение TEST^1 для переменной среды с именем testVar , введите:

Команда set присваивает значение переменной всему, что следует за знаком равенства (=). Поэтому, если вы наберете set testVar=test^1 , вы получите следующий результат: testVar=test^1 .

Чтобы установить значение TEST&1 для переменной среды testVar , введите:

Чтобы установить переменную среды с именем INCLUDE, чтобы с ней была связана строка c:\directory, введите:

Затем вы можете использовать строку c:\directory в пакетных файлах, заключив имя INCLUDE со знаками процента (%).Например, вы можете использовать dir %include% в пакетном файле для отображения содержимого каталога, связанного с переменной среды INCLUDE. После обработки этой команды строка c:\directory заменяет %include%.

Чтобы использовать команду set в пакетной программе для добавления нового каталога в переменную среды PATH, введите:

Чтобы отобразить список всех переменных среды, начинающихся с буквы P, введите:

В пакетных файлах есть два типа переменных. Один предназначен для параметров, которые могут быть переданы при вызове пакетного файла, а другой — с помощью команды set.

Аргументы командной строки

Пакетные сценарии поддерживают концепцию аргументов командной строки, при этом аргументы могут передаваться в пакетный файл при вызове. Аргументы можно вызывать из пакетных файлов через переменные %1, %2, %3 и т. д.

В следующем примере показан пакетный файл, который принимает 3 аргумента командной строки и выводит их на экран командной строки.

Если приведенный выше пакетный сценарий хранится в файле с именем test.bat и мы должны запустить пакет как

На снимке экрана показано, как это будет выглядеть в командной строке при выполнении пакетного файла.

Аргументы командной строки

Приведенная выше команда выводит следующий результат.

Если бы мы запускали пакет как

Вывод останется таким же, как указано выше. Однако четвертый параметр будет проигнорирован.

Установить команду

Другой способ инициализации переменных – это команда set. Ниже приведен синтаксис команды set.

Синтаксис

имя-переменной – это имя переменной, которую вы хотите установить.

значение — это значение, которое необходимо установить для переменной.

/A — этот переключатель используется, если значение должно быть числовым по своей природе.

В следующем примере показан простой способ использования команды set.

Пример

В приведенном выше фрагменте кода переменная с именем message определена и имеет значение "Hello World".

Чтобы отобразить значение переменной, обратите внимание, что переменная должна быть заключена в знак %.

Вывод

Приведенная выше команда выводит следующий результат.

Работа с числовыми значениями

В пакетном сценарии также можно определить переменную для хранения числового значения. Это можно сделать с помощью переключателя /A.

В следующем коде показан простой способ установки числовых значений с помощью переключателя /A.

Сначала мы устанавливаем значения двух переменных, a и b, равные 5 и 10 соответственно.

Мы добавляем эти значения и сохраняем в переменной c.

Наконец, мы отображаем значение переменной c.

Выход вышеуказанной программы будет равен 15.

Все арифметические операторы работают в пакетных файлах. В следующем примере показано, как арифметические операторы можно использовать в пакетных файлах.

Приведенная выше команда выводит следующий результат.

Локальные и глобальные переменные

В любом языке программирования есть возможность пометить переменные как имеющие какую-то область действия, то есть раздел кода, в котором к ним можно получить доступ. Обычно к переменной с глобальной областью можно получить доступ из любой точки программы, тогда как локальные переменные имеют определенную границу, в которой к ним можно получить доступ.

Сценарии DOS также имеют определения для локальных и глобальных переменных. По умолчанию переменные являются глобальными для всего сеанса командной строки. Вызовите команду SETLOCAL, чтобы сделать переменные локальными для области вашего скрипта. После вызова SETLOCAL любые назначения переменных возвращаются при вызове ENDLOCAL, вызове EXIT или когда выполнение достигает конца файла (EOF) в вашем сценарии. В следующем примере показана разница между локальными и глобальными переменными, установленными в скрипте.

Пример

Несколько ключевых моментов, на которые следует обратить внимание в отношении вышеуказанной программы.

"globalvar" имеет глобальную область действия и доступна во всем скрипте.

Переменная var определена в локальной области видимости, поскольку она заключена между блоками SETLOCAL и ENDLOCAL. Следовательно, эта переменная будет уничтожена, как только будет выполнен оператор ‘ENDLOCAL’.

Вывод

Приведенная выше команда выводит следующий результат.

Вы заметите, что команда echo %var% ничего не даст, потому что после оператора ENDLOCAL переменной var больше не будет существовать.

Работа с переменными среды

Если у вас есть переменные, которые будут использоваться в пакетных файлах, всегда предпочтительнее использовать переменные среды. Как только переменная среды определена, к ней можно получить доступ через знак %. В следующем примере показано, как увидеть JAVA_HOME, определенный в системе. Переменная JAVA_HOME — это ключевой компонент, который обычно используется в самых разных приложениях.

Вывод покажет каталог JAVA_HOME, который зависит от системы к системе. Ниже приведен пример вывода.


Подпишитесь на наши фан-страницы, чтобы получать уведомления каждый раз, когда появляются новые статьи. Фейсбук Твиттер

1- Что такое переменная?

Переменная – это базовое понятие в компьютерных науках. Это значение, которое может измениться. Как и в других языках, в пакетной службе есть понятие переменной.

  • Переменные объявляются в файле с помощью команды set.
  • Переменные-аргументы передаются извне, когда файл вызывается для выполнения.

2- Общие переменные

В языке пакетной обработки нет четкой концепции типа данных. Обычно переменная имеет значение, представляющее собой строку, включая символы после знака = до конца строки. (Включая белые пробелы, если применимо).






3- Переменные аргумента

При вызове для выполнения пакетного файла вы можете передать значения в файл. Вы можете получить доступ к этим значениям через такие переменные, как %1, %2, %3. в файле. Эти переменные также называются переменными-аргументами.

Мы тестируем приведенный выше пример, открыв окно CMD и компакт-диск, чтобы перейти к папке, содержащей файл argumentsVariables.bat




4- Область действия переменной

При открытии командного окна начинается сеанс. Такой сеанс завершится после закрытия командного окна. Во время сеанса вы можете выполнить один или несколько пакетных файлов. Переменные, созданные в предыдущем файле, можно просмотреть в следующем файле. Такие переменные называются глобальными переменными. Однако вы можете создать локальную переменную. Локальная переменная существует только в файле ее определения или в разделе этого файла.


Переменные, объявленные в пакетном файле и не расположенные в блоке setlocal .. endlocal, будут глобальными переменными. Их можно использовать в других файлах в том же сеансе.

В этом примере у нас есть два файла, например, batchFile1.bat и batchFile2.bat. Переменная MY_ENVIRONMENT определена в файле 1 и используется в файле 2.

Откройте CMD и компакт-диск в папку, содержащую файлы batchFile1.bat, batchFile2.bat, и запустите эти файлы соответственно.



5- Переменные среды Windows

Windows позволяет создавать переменные среды. Эти переменные будут глобальными переменными, которые можно использовать в любом пакетном файле.

  • Пуск/Панель управления/Система



  • Дополнительно (вкладка) > Переменные среды..



Здесь вы можете создать переменную среды для текущего пользователя или системную переменную среды, которую может использовать любой пользователь.

Например, я создаю переменную среды с именем MY_ENVIRONMENT_VARIABLE и ее значением "Мое значение переменной среды!".

Я пытаюсь определить и использовать переменную в пакетном файле. Похоже, это должно быть просто:

Вывод, который я получаю, следующий:

Что здесь происходит? Почему моя переменная не вызывается эхом?

4 ответа 4

Пробел перед = интерпретируется как часть имени, а пробел после него (а также кавычки) интерпретируются как часть значения. Таким образом, на созданную вами переменную можно ссылаться с помощью %location %.Если это не то, что вам нужно, удалите лишние пробелы в определении.

Если пробел перед = интерпретируется как часть имени, то на переменную нельзя ссылаться как на %location% , на нее нужно ссылаться как на %location % . Это опечатка?

Пробелы имеют большое значение. Вы создали переменную с именем 'location' со значением
' "bob"' . Примечание. Чтобы показать расположение пробела, были добавлены одинарные кавычки.

Если вы хотите, чтобы ваше значение было в кавычках, тогда ваш код должен выглядеть так

Если вам не нужны кавычки, ваш код должен выглядеть так

Последний синтаксис предотвращает случайное появление пробелов в конце значения, а также защищает от специальных символов, таких как & | и т. д.

@Wolf - Нет, недостатков нет. Однако есть предел, когда он наиболее эффективен. Пока значение не содержит кавычек, почти любые символы могут появляться в значении, не беспокоясь об экранировании. Исключениями являются % и, возможно, ! если отложенное расширение включено. Но если значение действительно содержит кавычки, вам следует побеспокоиться о том, когда следует избегать ядовитых символов, таких как | , & и т. д.

Похоже, это то же самое, что и установка переменной окружения в Windows. Это единственный способ использования локальных переменных в пакетных сценариях?

@Wolf, вам нужно только убедиться, что расширения команд включены, но в любом случае это конфигурация по умолчанию.

(вы допустили ошибки: пробел и " " )

set /p запрашивает пользователя и сохраняет ответ в указанной переменной. например, установите /p name="Как вас зовут?" & echo Привет, %name%.

-1, синтаксис set /p "varname"="text" неверен, он создает переменную с именем location" (с завершающей кавычкой!). Следует установить /p location="bob" . Но даже тогда это больше не соответствует вопросу

Рассмотрите также возможность использования SETX — он установит переменную на уровне пользователя или компьютера (доступно для всех пользователей), хотя эту переменную можно будет использовать при следующем открытии cmd.exe, поэтому часто ее можно использовать вместе с SET :< /p>

Вы также можете напрямую редактировать значения реестра:

Переменные пользователя: HKEY_CURRENT_USER\Environment

Системные переменные: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

Что позволит избежать некоторых ограничений SET и SETX, таких как переменные, содержащие = в своих именах.

Стороннее редактирование

SETX.exe Постоянная установка переменных среды

SETX может использоваться для установки переменных среды для компьютера (HKLM) или текущего пользователя (HKCU):

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

Здесь код объявляет новую переменную var со значением 10 . По умолчанию все переменные хранятся внутри в виде строк; это означает, что значение 10 ничем не отличается от foo1234 или Hello, World!

Примечания о кавычках

Используемые кавычки будут включены в значение переменной:

Пробелы в переменных

В языке пакетной обработки пробелы считаются допустимыми частями имен переменных. Например, установка var = 10 приведет к тому, что переменная с именем var будет содержать значение 10 (обратите внимание на дополнительный пробел справа от var и слева от 10).

Использование кавычек для устранения пробелов

Чтобы избежать пробелов, используйте кавычки вокруг всего назначения; имя и значение переменной. Это также предотвращает случайные пробелы в конце строки (символ ␣ обозначает пробел):

Кроме того, используйте кавычки при объединении нескольких операторов с помощью & или | - как вариант, поместите символ сразу после конца значения переменной:

Использование

Этот код будет отображать значение var

Если используется setLocal EnableDelayedExpansion, следующее будет отображать значение var (стандартное выражение %var% не будет работать в этом контексте).

В пакетных файлах переменные можно использовать в любом контексте, в том числе как части команд или части других переменных. Вы не можете вызывать переменную до ее определения.

Использование переменных в качестве команд:

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

Подстановка переменных

В отличие от других языков программирования, в пакетном файле переменная заменяется ее фактическим значением перед запуском пакетного сценария. Другими словами, подстановка производится, когда сценарий считывается в память командным процессором, а не когда сценарий позже запускается.

Это позволяет использовать переменные в качестве команд внутри скрипта, а также как часть имен других переменных в скрипте и т. д. "Скрипт" в данном контексте представляет собой строку или блок кода, заключенный в круглые скобки: () .

Но такое поведение означает, что вы не можете изменить значение переменной внутри блока!

поскольку (как вы видите, наблюдая за запуском скрипта в командном окне) он оценивается как:

В приведенном выше примере команда ECHO оценивается как Hello, когда сценарий считывается в память, поэтому сценарий всегда будет повторять Hello, сколько бы проходов через сценарий ни выполнялось.

Способ добиться более "традиционного" поведения переменных (когда переменная раскрывается во время выполнения скрипта) – включить "отложенное раскрытие". Это включает в себя добавление этой команды в сценарий перед инструкцией цикла (обычно это цикл FOR в пакетном сценарии) и использование восклицательного знака (!) вместо знака процента (%) в имени переменной:

Синтаксис %%a в (1,1,2) приводит к тому, что цикл выполняется 2 раза: в первый раз переменная принимает свое начальное значение 'Hello', а при втором проходе цикла - имеет выполнил вторую инструкцию SET как последнее действие на 1-м проходе - это изменилось на исправленное значение «До свидания».

Расширенная замена переменных

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

Это полезно, например, в цикле FOR. Как в следующем примере, где у нас есть пронумерованный список переменных:

"c:\MyFiles\test1.txt" "c:\MyFiles\test2.txt" "c:\MyFiles\test3.txt"

Этого можно добиться с помощью следующего цикла FOR:

Обратите внимание, что переменная !i! сначала расширяется до своего начального значения 1, затем результирующая переменная %1 расширяется до фактического значения c:\MyFiles\test1.txt . Это двойное расширение переменной i . В следующей строке i снова расширяется вдвое с помощью команды CALL ECHO вместе с префиксом переменной %%, а затем выводится на экран (т. е. отображается на экране).

При каждом последующем прохождении цикла начальное число увеличивается на 1 (из-за кода i+=1 ). Таким образом, оно увеличивается до 2 при 2-м проходе через петлю и до 3 при 3-м проходе. Таким образом, строка, отображаемая на экране, изменяется при каждом проходе.

Объявить несколько переменных

Если в начале пакета определено несколько переменных, можно использовать краткую форму определения, заменив строку.

Обратите внимание, что в приведенном выше примере переменные изначально сортируются в алфавитном порядке при выводе на экран.

Использование переменной в качестве массива

Можно создать набор переменных, которые могут действовать аналогично массиву (хотя они не являются фактическим объектом массива), используя пробелы в операторе SET:

Также можно объявить вашу переменную с помощью индексов, чтобы вы могли получить конкретную информацию. Это создаст несколько переменных с иллюзией массива:

Обратите внимание, что в приведенном выше примере вы не можете ссылаться на var без указания желаемого индекса, потому что var не существует сам по себе. В этом примере также используется setlocal enabledelayedexpansion в сочетании с восклицательными знаками в !var[%%a]! . Дополнительную информацию об этом можно найти в документации по области подстановки переменных.

Операции с переменными

Окончательное значение var равно 20.

Вторая строка не работает в командном блоке, используемом, например, в условии IF или в цикле FOR, так как потребуется отложенное расширение вместо стандартного расширения переменной среды.

Вот еще один, более удобный способ работы в командном блоке:

Среда командной строки поддерживает 32-разрядные целые числа со знаком:

  • дополнение + и +=
  • вычитание - и -=
  • умножение * и *=
  • дивизия / и /=
  • деление модуля % и %=
  • побитовое И &
  • побитовое ИЛИ |
  • побитовое НЕ ~
  • побитовое исключающее ИЛИ ^
  • побитовый сдвиг влево
  • побитовый сдвиг вправо >>
  • логическое НЕ!
  • унарный минус -
  • группировка с помощью ( и )

Интерпретатор команд Windows не поддерживает 64-битные целые значения или значения с плавающей запятой в арифметических выражениях.

Примечание. Оператор % должен быть записан в пакетном файле как %%, чтобы его можно было интерпретировать как оператор.

В окне командной строки выполнение команды set /A Value=8 % 3 присваивает значение 2 переменной среды Value и дополнительно выводит 2 .

В командном файле должно быть записано set /A Value=8 %% 3, чтобы присвоить значение 2 переменной окружения Value и ничего не выводится, соответственно написано для обработки STDOUT (стандартный вывод). Установка строки /A Value=8 % 3 в пакетном файле приведет к появлению сообщения об ошибке Отсутствует оператор при выполнении пакетного файла.

В среде ключ /A требуется только для арифметических операций, а не для обычных строковых переменных.

Каждая строка в арифметическом выражении после набора /A, являющаяся числом или оператором, автоматически интерпретируется как имя переменной среды.

По этой причине обращение к значению переменной с помощью %variable% или !variable! нет необходимости, когда имя переменной состоит только из словесных символов (0-9A-Za-z_), где первый символ не является цифрой, что особенно полезно в командном блоке, начинающемся с ( и заканчивающемся соответствием ).

Числа преобразуются из строки в целое с помощью функции strtol C/C++ с основанием, равным нулю, что означает автоматическое определение основания, что может легко привести к неожиданным результатам.

Вывод этого примера:

Переменные, не определенные при вычислении арифметического выражения, заменяются значением 0.

Установка переменных из ввода

Используя переключатель /p с командой SET, вы можете определять переменные из ввода.

Читайте также: