Почему не выводится строка с "echo %var%" после использования "set var = text" в командной строке?

Я установил переменную в CMD на Windows 8.1 с set команда, и попытался повторить это.

Вот пример:

 C:\Users\Logan>set var = text

 C:\Users\Logan>set var
 var = text

 C:\Users\Logan>echo %var%
 %var%

 C:\Users\Logan>

Так есть ли способ заставить командную строку отображать переменную, а не необработанный текст?

2 ответа

Решение

Вам нужно приблизить ваш текст из одинакового символа:

set var=text
echo %var%
text

Присвоение значения / строки переменной среды

С включенными расширениями команд по умолчанию лучше всего использовать:

set "var=text"

Команда установлена, а параметр "variable=value",

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

Если двойные кавычки не используются вокруг variable=value, набор команд интерпретирует все до конца строки после первого знака равенства, включая невидимые пробелы и горизонтальные табуляции в конце строки, как строковое значение для присвоения переменной.

Имя переменной начинается с первого непробельного символа (после двойной кавычки, если используется) и заканчивается слева до первого знака равенства. Значение, присвоенное переменной, начинается справа от первого знака равенства и заканчивается в конце строки или последней двойной кавычки.

set VAR = TEXT

создает переменную окружения с именем VAR Space и присваивает этой переменной строку Space TEXT.

Также используя

set var="text"

часто неверно, так как это приводит к присвоению переменной var текст с включенными кавычками и все завершающие пробелы и вкладки. Ссылка сейчас var в другой строке кода с окружающими кавычками часто появляется сообщение об ошибке, поскольку переменная содержит текст, уже заключенный в кавычки. Для более подробной информации смотрите ответ Как установить переменные окружения с пробелами?

Пример:

@echo off
setlocal
set "var=text"
set "var = text"
set "var1=and more text"
set var2="and more text"
set var3="text with 1 trailing space" 
set var
echo var3=%var3%^<- Do you see the trailing space?
echo/
set UnwantedSpaceVar=Hello 
echo %UnwantedSpaceVar%! ^<- Where does the space come from?
echo/
echo There is a trailing space after Hello in this code snippet.
echo/
set "TrailingSpacesIgnored=Hi"   
echo %TrailingSpacesIgnored%! ^<- The 3 trailing spaces above are ignored.
echo/
endlocal
pause

Запуск этого небольшого пакетного кода приводит к выводу:

var=text
var = text
var1=and more text
var2="and more text"
var3="text with 1 trailing space" 
var3="text with 1 trailing space" <- Do you see the trailing space?

Hello ! <- Where does the space come from?

There is a trailing space after Hello in this code snippet.

Hi! <- The 3 trailing spaces above are ignored.

Ограждающие variable=value в кавычки можно сделать, даже если сам текст содержит 1 или более двойных кавычек.

set "Quote=""

Эта строка определяет переменную Quote со значением ", Набор команд интерпретирует все после первого знака равенства слева до последней двойной кавычки как значение, которое присваивается переменной с именем между первой кавычкой и первым знаком равенства.

Примечание: строковое значение с " внутри и рядом & или же && или же || может быть даже на использование set "variable=value" неверно истолковано и приводит к неожиданному поведению, которое можно увидеть при запуске командного файла со следующими двумя строками:

@echo off
set "Variable=Value with one double quote in the middle" & echo Oh, there is something wrong here!"

Value with one double quote in the middle" & echo Oh, there is something wrong here! строка, назначаемая переменной среды, но назначенная переменной просто Value with one double quote in the middle и остальная часть строки после " в середине и после & интерпретируется как условный оператор, а не буквально интерпретируется как дополнительная команда для выполнения cmd.exe, Та же проблема существует с && или же || после " с 0 или более пробелов / табуляции между. Эта проблема не вызвана набором команд. Это вызвано процессором команд Windows, который разбивает строку на командную строку с set и еще одну командную строку с echo с условным выполнением командной строки echo.

Переменная с отключенными расширениями команд

Синтаксис команды set "variable=value" не может использоваться, если расширения команд отключены с помощью setlocal DisableExtensions в командном файле (или в реестре Windows, что очень редко встречается и никогда не видел я ни на одном компьютере с Windows). Синтаксическая ошибка будет результатом выполнения командного файла.

Можно использовать только set variable=value с отключенными расширениями команд, в результате чего значение может содержать также двойные кавычки, и необходимо соблюдать осторожность в конечных пробелах / табуляциях, так как они также присваиваются переменной среды.

Запустить в окне командной строки cmd /? а также setlocal /? для получения дополнительной информации о расширениях команд и на какие команды влияют расширения команд. Примечание. В списке вывода затронутых команд пропускается выход, как описано в ответах на вопрос. Куда возвращается GOTO:EOF?

Присвоение переменной с помощью арифметического выражения

Использование набора команд с опцией /A полностью изменяет синтаксический анализ второго аргумента, т.е. строки после set /A, С опцией /A в качестве первого аргумента вторая строка интерпретируется как арифметическое выражение и поэтому обрабатывается совершенно иначе, чем при присвоении строкового значения переменной среды. Переменные среды всегда имеют тип string и никогда не имеют тип integer.

Использование опции /A требует включенных расширений команд, так как в противном случае набор команд полностью игнорирует остальную часть строки без каких-либо сообщений об ошибках.

В большинстве случаев не рекомендуется просто присваивать номер переменной среды, используя арифметическое выражение, т.е. set /A var=1, set "var=1" или просто set var=1 (и без пробелов) немного быстрее, потому что переменные окружения всегда имеют тип string.

В арифметическом выражении пробелы интерпретируются как разделители для имен переменных, чисел и операторов. По этой причине командная строка set /A var = 1 не определяет переменную с именем VAR Space со строкой Space 1 как set var = 1 делает. set /A var = 1 определяет переменную с именем VAR со строковым значением 1 после преобразования 1 из строки (пакетный файл содержит 1 как символ со значением шестнадцатеричного кода 31) в целое число со значением 1 и обратно к строке с двумя значениями 0x31 и 0x00 (строка заканчивается нулем).

Присвоение переменной через приглашение

Также с помощью набора команд с опцией /P изменяет синтаксический анализ строки после имени переменной и знака равенства. Строка после имени переменной и знака равенства интерпретируется как выводимый текст подсказки, а не как строка, присваиваемая переменной среды.

Переменной среды присваивается строка, введенная пользователем по запросу (или перенаправленная из файла, команды или приложения), или в случае, если пользователь ничего не вводит до нажатия RETURN или ENTER, сохраняет свое текущее значение, соответственно, по-прежнему не определено, если не определено ранее Подсказка.

Использование опции /P требует включенных расширений команд, так как в противном случае набор команд полностью игнорирует остальную часть строки без каких-либо сообщений об ошибках.

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

set /P var="Please enter something: "

Набор команд в этом случае автоматически удаляет двойные кавычки вокруг текста приглашения перед печатью для обработки STDOUT (окно консоли, если оно не перенаправлено).

Но работа это также:

set /P "var=Please enter something: "

Пожалуйста, прочитайте этот ответ для более подробной информации о разборе текста подсказки и о том, как вывести текст подсказки с двойными кавычками

Другие вопросы по тегам