CMD / Batch: пользовательский вход внутри цикла for - PullRequest
2 голосов
/ 17 сентября 2011

Я пытаюсь получить входные данные внутри цикла for.Но входные данные не назначены входной переменной.

@echo off
echo Enter something for 3 times
for %%i in ( 1 2 3 ) do ( 
set /p usr=""
echo "You entered %usr%"
)

pause

Строка

echo "Вы ввели% usr%"

только для печати"Вы вошли ".Так что я тут не так делаю?

1 Ответ

5 голосов
/ 17 сентября 2011

Они назначены . Это отображение не работает, как ожидалось.

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

… ( 
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, которые могут возникнуть при вводе пользователем.

...