Batch file 为什么批处理文件执行在用户提示中未输入任何内容时意外结束?
我尝试创建一个批处理文件,向用户提问(就像测试if和else语句一样),并等待用户输入答案 我尝试使用:Batch file 为什么批处理文件执行在用户提示中未输入任何内容时意外结束?,batch-file,Batch File,我尝试创建一个批处理文件,向用户提问(就像测试if和else语句一样),并等待用户输入答案 我尝试使用: @echo off echo hi! pause CLS echo how are you? set /p what= if %what%==Good ( GOTO good ) else ( GOTO what ) :Good CLS echo cool! pause GOTO end :what CLS echo what? pause GOTO end :end 目标是转到标签
@echo off
echo hi!
pause
CLS
echo how are you?
set /p what=
if %what%==Good (
GOTO good
) else (
GOTO what )
:Good
CLS
echo cool!
pause
GOTO end
:what
CLS
echo what?
pause
GOTO end
:end
目标是转到标签what
,并在那里继续对用户输入进行批处理文件处理,而不是Good
但是,如果用户因为只按ENTER键而未输入任何内容,则批处理脚本的执行将结束,而不是转到标签what
下的代码。此外,如果在提示时键入了其他带有空格的内容,则批处理文件也将结束脚本
为什么批处理文件执行在用户提示中未输入任何内容时意外结束?code>set/p提示用户输入字符串。用户有自由
a == a rd /s /q "%TEMP%" & rem
what
,在用户提示后仍未定义,因此在预处理命令行后,cmd.exe
执行的下一个命令行为:
if ==Good (
因此,由于此语法错误,左侧操作数丢失,Windows命令解释器退出批处理文件的执行,因为从命令提示符窗口中运行此批处理文件而不是双击批处理文件时可以看到此语法错误。另见
要使这样的命令提示符在无输入甚至错误输入的情况下安全,请使用以下代码:
@echo off
cls
echo Hi!
echo/
set "UserInput="
set /P "UserInput=How are you? "
if not defined UserInput goto WrongInput
setlocal EnableDelayedExpansion
if /I "!UserInput!" == "Good" endlocal & set "UserInput=" & goto Good
endlocal
set "UserInput="
:WrongInput
echo/
echo What?
echo/
pause
goto :EOF
:Good
echo/
echo Cool!
echo/
pause
首先,在提示用户之前,明确删除环境变量UserInput
用户提示后,使用IF条件检查变量UserInput
是否仍未定义,这意味着如果该条件为真,则用户根本没有输入任何内容
但是,如果用户输入了字符串,则会使用启用的延迟环境变量扩展设置一个新的字符串,UserInput
的值会与使用延迟环境变量扩展的字符串“Good”
进行不区分大小写的比较。这可以防止由于用户输入引起的语法错误而意外或故意错误的输入导致批处理文件执行退出,或者执行与设计完全不同的操作
在这种情况下,在字符串比较之后,不再需要启用了延迟环境变量扩展的本地环境,因为字符串比较总是在两侧的字符串周围包含双引号。因此,在任何情况下都会立即恢复以前的环境
如果没有定义UserInput,可以省略,因为在两个比较的字符串上使用了双引号,因为左字符串不能再为空。通常,建议为批处理文件定义本地环境,以防以后从其他批处理文件或命令提示窗口中调用
@echo off
setlocal EnableExtensions DisableDelayedExpansion
cls
echo Hi!
echo/
set "UserInput="
set /P "UserInput=How are you? "
setlocal EnableDelayedExpansion
if /I "!UserInput!" == "Good" endlocal & goto Good
endlocal
echo/
echo What?
echo/
pause
goto EndBatch
:Good
echo/
echo Cool!
echo/
pause
:EndBatch
endlocal
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面
cls/?
echo/?
endlocal/?
goto/?
如果/?
暂停/?
设置/?
setlocal/?
有关在批处理文件中使用环境变量的更多详细信息和重要事实,请参见以下问题及其答案:
- DosTips论坛主题