Batch file 如果未输入任何输入(Bat文件),则返回开始

Batch file 如果未输入任何输入(Bat文件),则返回开始,batch-file,if-statement,Batch File,If Statement,好的,首先我为我糟糕的英语道歉:) 现在来解决我的问题 我试图创建一个具有多个选项的脚本文件,但遇到了一个问题。 如果我没有输入(只需按enter键),文件将显示错误并关闭。 现在我的问题是,如果没有输入,是否有一个命令将强制文件返回到起始位置 这是我剧本的相关部分 :input @echo off CLS ECHO ############################################# ECHO #

好的,首先我为我糟糕的英语道歉:) 现在来解决我的问题

我试图创建一个具有多个选项的脚本文件,但遇到了一个问题。 如果我没有输入(只需按enter键),文件将显示错误并关闭。 现在我的问题是,如果没有输入,是否有一个命令将强制文件返回到起始位置

这是我剧本的相关部分

:input
@echo off
CLS
ECHO   #############################################
ECHO   #                                           #
ECHO   #  1 - Make A System Folder or File         #
ECHO   #  2 - Restore Folder or File               #
Echo   #  3 - Exit                                 #
ECHO   #                                           #
ECHO   #############################################

SET /P O=Set Your Choice And Press Enter:
ECHO Loading .........
(
IF %O%==1 GOTO Hide
IF %O%==2 GOTO Show
IF %O%==3 GOTO Exit
IF %O%=="" GOTO input
) 
ELSE (
    GOTO input
)
正如你所看到的,我试图使用“Else”,但它只能部分起作用。 如果我输入的变量不是给定列表的一部分(在我的示例1、2、3中),则文件将返回到开头,即使我在之后发送了非输入请求,文件仍能正常工作。 问题非常具体,只有当第一个输入是非输入时,问题才会出现。 在任何其他情况下,脚本都可以正常工作


谢谢你,我再次为我糟糕的英语感到非常抱歉:)

不需要括号。试试这个

:input
@echo off
CLS
ECHO   #############################################
ECHO   #                                           #
ECHO   #  1 - Make A System Folder or File         #
ECHO   #  2 - Restore Folder or File               #
Echo   #  3 - Exit                                 #
ECHO   #                                           #
ECHO   #############################################

SET /P O=Set Your Choice And Press Enter:
ECHO Loading .........
IF %O%==1 GOTO Hide
IF %O%==2 GOTO Show
IF %O%==3 GOTO Exit
IF %O%=="" GOTO input

ELSE 
GOTO input
顺便说一句,你的英语很好

  • 始终在输入前重置变量。当用户只按enter键时,变量不会自动重置

    :: Delete variable %O%
    SET "O="
    SET /P "O=Set Your Choice And Press Enter: "
    
  • 始终将变量置于引号中(在IF中)

  • GOTO-Label
    永远不会返回(例外情况-
    GOTO:Label
    在某些疯狂的情况下)。在你的情况下,你可以写:

    IF "%O%"=="1" GOTO Hide
    IF "%O%"=="2" GOTO Show
    IF "%O%"=="3" GOTO Exit
    
    GOTO INPUT
    
  • 在每个“过程”命令后添加
    exit/B
    ,以防止代码更改后出现疯狂解析。警告: Goto 命令不工作,如C++中的“代码>空洞< /代码>”,因此命令<代码>退出/b>代码>将停止脚本。但是如果您使用的是
    调用:label
    命令
    退出/B
    将仅在
    :label
    下停止代码


  • 是的,如果您想在没有输入的情况下转到:开始或:任何内容,则需要一个解决方案 写下以下内容:

    这第一行是关键

    set num=""
    
    set /P num=%input%
    
    if %num%==1 goto Choice1
    if %num%==2 goto Choice2
    
    if "%num%"=="" goto Start
    
    goto Start
    
    最后一行用于超出您选择范围的输入 (在本例中,3将无效,并再次转到起始位置。)

    不过有一个更好更简单的解决方案!

    这只是一个“更专业”的多选菜单解决方案,它真的很有用

    不要设置%input%和所有jazz,只需使用choice!如果输入的值超出范围(123表示可以选择1、2或3),则会出现“嘟嘟”声,表示输入无效

    set errorlevel=   
    
    CHOICE /C 123  >nul
    if %errorlevel%==1 goto Choice1
    if %errorlevel%==2 goto Choice2
    if %errorlevel%==3 goto Choice3
    
    就是这样!简单多了,对吧?那么就解释一下这些线条的意思

    第一行只是将errorlevel设置为空,因为当您获得更高的级别时,errorlevel可能会意外地被指定一个值。因此,请稍后省去您的烦恼并将其删除

    >nul“隐藏”了这是一个选择的事实。只需在上面放一条回音信息,上面写着“按数字X选择X”。我喜欢这一点,因为你不需要在之后按回车键-如果你有很多选择,可以节省时间

    现在,errorlevel是而不是分配给您的输入…所以要小心

    我的选择可以是“CHOICE/C 3689>nul”,但输入3时errorlevel输出仍然是errorlevel=1,输入6时errorlevel=2,依此类推

    因此,如果您可以选择按0返回主菜单,并选择/C 0123,则按0将返回errorlevel=1,按1将返回errorlevel=2…等等

    选择非常有用,只需输入Choice/?了解更多详细信息。

    我试过了

    @echo off
    title (title)
    :c
    echo ==============================
    echo =  1=Create Folder/File      =
    echo =  2=File Restore            =
    echo =  3=Exit                    =
    echo ==============================
    :a
    echo Press space-Enter for nothing
    set /p 0=What do you want to do? :
    if /i "%0%"=="1" goto 1
    if /i "%0%"=="2" goto 2
    if /i "%0%"=="3" goto 3
    if /i "%0%"==" " goto h
    PAUSE
    :1
    set /p key=What do you want your folder name to be? :
    cd
    Mkdir %key%
    PAUSE
    :2
    set /p p=Whats the name of the file you want to restore? :
    chkdsk %p%
    PAUSE
    :3
    echo Exiting.
    ping localhost -n 2
    cls
    echo Exiting..
    ping localhost -n 2
    cls
    Echo Exiting...
    ping localhost -n 2
    exit /b
    :h
    set /p YN=Go back? (Y,N)
    if %YN%=="Y" goto a
    if %YN%=="N" goto 3
    PAUSE
    

    +1对于实际解决问题,尽管我可能不同意你答案的某些部分(比如在一些疯狂的情况下“goto:label”——你的意思是什么?)。此外,像这样放置
    退出/b
    是绝对多余的(而且你从来没有解释为什么要放在那里)。当我开始在批处理文件上编程“扫雷者”时,我遇到了一些我描述的错误。当我替换“goto-label”上的所有“goto:label”时,错误消失了。非常奇怪。关于命令“exit/b”-这是编写“exit/b”(或goto:eof)的好风格,可以防止在更改代码“goto:label”时进行下一次解析–我现在明白了,谢谢,我还以为你指的是别的。我从来没有使用过
    goto:label
    ,除了
    goto:eof
    的特殊情况,所以我不知道这些事情。重新“退出/b”–样式点很好,甚至可能值得添加到答案中。只是在这种特殊情况下,
    exit/b
    命令永远无法到达。此外,OP明确表示这只是脚本的一部分,您可以通过GOTO的存在和相应标签的缺失猜到。因此,再次,在没有解释的情况下使用这样的退出命令可能会让人困惑。无论如何,感谢您的澄清。
    @echo off
    title (title)
    :c
    echo ==============================
    echo =  1=Create Folder/File      =
    echo =  2=File Restore            =
    echo =  3=Exit                    =
    echo ==============================
    :a
    echo Press space-Enter for nothing
    set /p 0=What do you want to do? :
    if /i "%0%"=="1" goto 1
    if /i "%0%"=="2" goto 2
    if /i "%0%"=="3" goto 3
    if /i "%0%"==" " goto h
    PAUSE
    :1
    set /p key=What do you want your folder name to be? :
    cd
    Mkdir %key%
    PAUSE
    :2
    set /p p=Whats the name of the file you want to restore? :
    chkdsk %p%
    PAUSE
    :3
    echo Exiting.
    ping localhost -n 2
    cls
    echo Exiting..
    ping localhost -n 2
    cls
    Echo Exiting...
    ping localhost -n 2
    exit /b
    :h
    set /p YN=Go back? (Y,N)
    if %YN%=="Y" goto a
    if %YN%=="N" goto 3
    PAUSE