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