Batch file CMD/Batch:for循环中的userinput

Batch file CMD/Batch:for循环中的userinput,batch-file,cmd,user-input,Batch File,Cmd,User Input,我试图在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%” 正在打印“您已输入”。那么我在这里做错了什么呢?他们被分配了。正是显示未按预期工作 这里有一个括号内的命令块,它是循环体: … ( set /p usr="" ec

我试图在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%”

正在打印“您已输入”。那么我在这里做错了什么呢?

他们被分配了。正是显示未按预期工作

这里有一个括号内的命令块,它是循环体:

… ( 
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
或直到脚本结束)。或者,您可以在脚本开始时简单地启用该模式,直到脚本结束时再将其关闭,但在这种情况下,您将不得不担心任何
可能出现在用户输入中。

非常感谢。现在一切正常:-)