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

时间:2017-12-04 17:30:26

标签: 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

目标是转到标签what并继续在那里处理用户输入除Good以外的任何内容的批处理文件。

但是如果用户只输入 ENTER 就没有输入任何内容,那么批处理脚本的执行就会结束,而不是转到标签what下面的代码。此外,如果在提示符下键入其他带空格的内容,批处理文件也会结束脚本。

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

1 个答案:

答案 0 :(得分:1)

set /P提示用户输入字符串。用户有自由

  1. 输入您要求的内容,
  2. 只需点击 RETURN ENTER 而不输入任何内容,
  3. 输入错误的字符串,例如

    a == a rd /s /q "%TEMP%" & rem
    
  4. 最后一个示例导致您的批处理代码删除了临时文件的用户文件夹。因此,请不要在批处理文件中尝试该用户输入。

    当用户在提示符下根本不输入任何内容时,指定的环境变量将保持其当前值。在您首次运行时根本没有定义环境变量what的情况下,在用户提示之后仍未定义它,因此在预处理命令行后由cmd.exe执行的下一个命令行是:

    if ==Good (
    

    因此,左侧操作数缺失并且Windows命令解释程序退出批处理文件的执行,因为此语法错误,因为在命令提示符窗口中运行此批处理文件而不是双击批处理文件时可以看到它。另请参阅Debugging a batch file

    要使这样的命令提示符在没有输入或输入错误的情况下安全,请使用以下代码:

    @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是否仍未定义,这意味着如果该条件为真,用户根本没有输入任何内容。< / p>

    但是,如果用户输入了字符串,则会设置新的local environment并启用延迟环境变量扩展,并将UserInput的值与字符串"Good"进行不区分大小写的比较使用延迟环境变量扩展。这可以防止由于用户输入引起的语法错误而导致批处理文件执行意外或故意错误输入,或者执行与设计完全不同的操作。

    在这种情况下,在字符串比较之后不再需要具有启用的延迟环境变量扩展的本地环境,其总是还包括两侧字符串周围的双引号。因此,无论如何都会立即恢复以前的环境。

    嗯,省略if not defined 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 /?
    • if /?
    • pause /?
    • set /?
    • setlocal /?

    另请参阅以下问题及其答案,以了解有关在批处理文件中使用环境变量的更多详细信息和重要事实: