我试图在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 "You entered %usr%"
只是打印"You Entered"。我哪里做错了?
它们是赋值的。是显示不正常
这里有一个带括号的命令块,它是循环体:
… (
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
或直到脚本结束)。或者,您可以简单地在脚本开始时启用该模式,直到脚本结束时才将其关闭,但在这种情况下,您将不得不担心用户输入中可能出现的任何!
。