在 if 语句中无法在批处理文件中接受用户输入

Cannot take user input in batch file while in if statement

我想在批处理文件中获取用户的输入,但是当我在 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 . . .

为什么会这样?

您需要在 IF 语句的顶部或上方添加此行:

SETLOCAL ENABLEDELAYEDEXPANSION

然后将%flag2%改为!flag2!

在块语句 (a parenthesised series of statements) 中,解析 整个 块并执行 then。块中的任何 %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%%