Batch file 为什么批处理文件执行在用户提示中未输入任何内容时意外结束?

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 目标是转到标签

我尝试创建一个批处理文件,向用户提问(就像测试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
目标是转到标签
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论坛主题