Почему не выводится строка с "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: "
Пожалуйста, прочитайте этот ответ для более подробной информации о разборе текста подсказки и о том, как вывести текст подсказки с двойными кавычками