我想在批处理文件中从用户那里获取输入,但是当我在 if 语句之外时它工作正常,但当我进入内部时,它不会获取用户的输入。
@echo off
set /p flag=Enter letter 'y':
echo %flag%
if %flag% == y (
set /p flag2=Enter random string:
echo flag2: %flag2%
)
pause
在上面的示例中,在我为第一个提示输入"y"之后,它打印了 %flag% 的内容,但在 if 语句内的第二个提示符中,%flag2% 没有获得任何值。
输出:
Enter letter 'y': y
y
Enter random string:lalala
flag2:
Press any key to continue . . .
为什么会这样?
在块语句(a parenthesised series of statements)
中,整个块被解析然后执行。块内的任何%var%
都将在解析块时(在执行块之前)替换为该变量的值,同样的事情适用于FOR ... DO (block)
。
因此,IF (something) else (somethingelse)
将在遇到IF
时使用 %variables%
的值执行。
克服此问题的两种常见方法是 1) 使用 setlocal enabledelayedexpansion
并使用 !var!
代替 %var%
来访问更改的值 var
或 2) 调用子例程以使用更改的值执行进一步处理。
因此,请注意使用 CALL ECHO %%var%%
来显示更改的值 var
。 CALL ECHO %%errorlevel%%
显示,但遗憾的是,然后重置错误级别。
尝试
CALL echo flag2: %%flag2%%
在IF
语句的顶部或上方添加此行:
SETLOCAL ENABLEDELAYEDEXPANSION
然后将%flag2%
更改为!flag2!
。