Они назначены . Это отображение не работает, как ожидалось.
Здесь у вас есть блок команд, заключенный в квадратные скобки, который представляет собой тело цикла:
… (
set /p usr=""
echo "You entered %usr%"
)
Блоки в квадратных скобках анализируются полностью перед началом выполнения блока. Следовательно, выражение %usr%
оценивается (заменяется его значением в данный момент) до выполнения блока. К моменту выполнения команды echo
там уже нет %usr%
, а есть пустая строка, значение которой было usr
на момент разбора.
Итак, вам нужно отложенное расширение . Включается этой командой:
SETLOCAL EnableDelayedExpansion
и действует до конца пакета или команды ENDLOCAL
.
Кроме того, для отложенного расширения вы должны использовать другой синтаксис: вместо %usr%
используйте !usr!
.
Вот ваш скрипт, модифицированный так, чтобы использовать отложенное расширение:
@echo off
echo Enter something for 3 times
for %%i in ( 1 2 3 ) do (
set /p usr=""
setlocal EnableDelayedExpansion
echo "You entered !usr!"
endlocal
)
pause
Еще одна вещь, которую следует запомнить: поскольку режим вводится с помощью варианта команды SETLOCAL
, это означает, что все изменения переменных среды являются локальными в пределах области действия команды SETLOCAL
(т.е. до тех пор, пока не будет выполнен ENDLOCAL
). или до конца сценария). В качестве альтернативы вы можете просто включить режим в начале скрипта и никогда не выключать его до конца, но в этом случае вам придется беспокоиться о любых !
s, которые могут возникнуть при вводе пользователем.