CMD / Batch:for循环内的用户输入

Alp*_*eph 2 cmd user-input batch-file

我正在尝试在for循环中接受输入。但是没有将输入分配给输入变量。

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

pause
Run Code Online (Sandbox Code Playgroud)

线

回声“您输入了%usr%”

只是打印“您输入了”。那我在做什么错呢?

And*_*y M 5

他们分配。这是显示无法正常工作。

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

… ( 
set /p usr=""
echo "You entered %usr%"
)
Run Code Online (Sandbox Code Playgroud)

带括号的块在块开始执行之前就已完全解析。的%usr%表达,因此,被评价(取代其在目前的值)之前的块执行。到echo命令执行时,这里已经不%usr%存在了,但是有一个空字符串,它 usr解析时的值。

因此,您需要的是延迟扩展。通过以下命令启用它:

SETLOCAL EnableDelayedExpansion
Run Code Online (Sandbox Code Playgroud)

它会一直有效直到ENDLOCAL到达的批处理结束或命令为止。

另外,对于延迟扩展,您必须使用其他语法:而不是%usr%use !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
Run Code Online (Sandbox Code Playgroud)

需要记住的一件事:由于该模式是通过SETLOCAL命令的变体引入的,这意味着对环境变量的所有更改都在SETLOCAL命令范围内(即,直到ENDLOCAL执行或直到脚本结束)是局部的。或者,您可以仅在脚本的开头启用该模式,而无需在结束之前将其关闭,但是在那种情况下,您将不得不担心!用户输入中可能会发生任何错误。