Batch file CMD/Batch:for循环中的userinput
我试图在for循环中获取输入。但是输入没有分配给输入变量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
@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
或直到脚本结束)。或者,您可以在脚本开始时简单地启用该模式,直到脚本结束时再将其关闭,但在这种情况下,您将不得不担心任何代码>可能出现在用户输入中。非常感谢。现在一切正常:-)