Windows XP 命令行脚本 (cmd.exe):在 if 之间使用 set /p 时无法正常工作。为什么?



我最近发现了一种简单的方法,可以使用set命令提供的/p选项在windows cmd.exe批处理文件中获取用户输入。但有一个奇怪的原因,我不明白set/p在if语句之间使用时表现得很棘手。

首先,创建一个名为"ScriptRunsOK.bat"的批处理文件,代码如下:

@echo off
rem Gets a User Yes-No Choice 
set /p UserInput=Your Choice [Y/N]:
set UserChoice=%UserInput:~0,1%
if "%UserChoice%"=="y" set UserChoice=Y
if "%UserChoice%"=="Y" (
echo You Accepted[%UserChoice%] typing %UserChoice%
) else (
echo You Rejected[%UserChoice%] typing %UserChoice%
)
pause

其次,创建一个批处理文件"ScriptRunsBAD.bat",其中包含if语句之间的"用户输入和评估"代码。代码如下:

@echo off
rem Gets a User Yes-No Choice. Choice Nested in a IF Statement 
set DummyVar=OK
if "%DummyVar%"=="OK" (
set /p UserInput=Your Chiuce [Y/N]:
set UserChoice=%UserInput:~0,1%
if "%UserChoice%"=="y" set UserChoice=Y
if "%UserChoice%"=="Y" (
echo You Accepted[%UserChoice%] typing %UserChoice%
) else (
echo You Rejected[%UserChoice%] typing %UserChoice%
)
)
pause

第三,只需双击"ScriptRunsOK.bat",或者直接从命令行重复运行。每次运行它都很好。但如果你对"ScriptRunsBAD.bat"进行同样的尝试,它就不会像我所说的那样工作。此外,当你从命令行运行它时,奇怪的是,它保留了上次执行时键入的用户输入。

导致该行为的"ScriptRunsBAD.bat"的代码是什么?在if或多行语句中使用set/p命令时,是否需要额外考虑?

好吧。最后,在阅读了@melpomine和@Wimmel发布的链接内容后(谢谢),我可以解决这个问题。简而言之(更多细节请参阅发布的链接)cmd脚本在解析每一行时评估变量(默认情况下)(而不是程序员所期望的习惯行为)。解决的脚本使用SETLOCAL ENABLEDELAYEDEXPANSION启用"延迟扩展",允许在使用感叹号引用时在执行时而不是在解析时扩展变量(请参见!UserInput:~0,1!!UserChoice!)。

脚本已解决:

@echo off
rem Gets a User Yes-No Choice. Choice Nested in a IF Statement 
set DummyVar=OK
SETLOCAL ENABLEDELAYEDEXPANSION
if "%DummyVar%"=="OK" (
set /p UserInput=Your Choice [Y/N]:
set UserChoice=!UserInput:~0,1!
if "!UserChoice!"=="y" set UserChoice=Y
if "!UserChoice!"=="Y" (
echo You Accepted[!UserChoice!] typing !UserInput!
) else (
echo You Rejected[!UserChoice!] typing !UserInput!
)
)
ENDLOCAL

最新更新