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%”
只是打印“您输入了”。那我在做什么错呢?
他们被分配。这是显示无法正常工作。
您在这里有一个带括号的命令块,它是循环体:
… (
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执行或直到脚本结束)是局部的。或者,您可以仅在脚本的开头启用该模式,而无需在结束之前将其关闭,但是在那种情况下,您将不得不担心!用户输入中可能会发生任何错误。