如何在.bat中请求和接收用户输入并使用它来运行某个程序?

时间:2012-08-18 18:09:29

标签: input batch-file

这是我到目前为止所拥有的

@echo off
:Ask
echo Would you like to use developer mode?(Y/N)
set INPUT=
set /P INPUT=Type input: %=%
If %INPUT%=="y" goto yes 
If %INPUT%=="n" goto no
If %INPUT%=="Y" goto yes
If %INPUT%=="N" goto no
:yes
java -jar lib/RSBot-4030.jar -dev
echo Starting RSbot in developer mode
:no
java -jar lib/RSBot-4030.jar
echo Starting RSbot in regular mode
pause

无论哪种方式,如果用户输入y或n,它总是以-dev模式运行。

如果答案是肯定的,如何让它在-dev模式下运行,如果答案为否,如何使其在常规模式下运行。另外,如果输入不是Y,N,y或n?

,如何再次询问

9 个答案:

答案 0 :(得分:39)

如果输入是N,则您的IF行评估如下:

If N=="y" goto yes 
If N=="n" goto no
…

也就是说,您要将N"y"进行比较,然后将"n"等进行比较,包括"N"。除非用户以某种方式决定输入"N""y"(即四个字符中的任何一个,但用双引号括起来),否则您永远不会得到匹配。

因此,您需要从"ynY移除N或将%INPUT%放在If "%INPUT%"=="y" goto yes If "%INPUT%"=="n" goto no If "%INPUT%"=="Y" goto yes If "%INPUT%"=="N" goto no 条件陈述。我会推荐后者,因为这样你就可以逃避至少一些在批处理脚本中具有特殊含义的字符(如果用户设法输入它们)。所以,这就是你应该得到的:

/I

顺便说一下,您可以通过将IF开关应用到If /I "%INPUT%"=="y" goto yes If /I "%INPUT%"=="n" goto no 语句来减少条件数,如下所示:

/I

... :yes java -jar lib/RSBot-4030.jar -dev echo Starting RSbot in developer mode goto cont :no java -jar lib/RSBot-4030.jar echo Starting RSbot in regular mode :cont pause 开关使比较不区分大小写,因此您不需要对不同大小写的字符串进行单独检查。

另一个问题是,在执行开发模式命令之后,没有跳过其他命令,因此,如果用户同意在开发模式下运行Java,他将在开发中同时运行它模式和非开发模式。所以也许你需要在你的脚本中添加这样的东西:

goto

最后,为了解决处理错误输入的问题,您可以在条件语句之后添加另一个(无条件)yes命令,就在goto Ask标签之前,即@echo off :Ask echo Would you like to use developer mode?(Y/N) set INPUT= set /P INPUT=Type input: %=% If /I "%INPUT%"=="y" goto yes If /I "%INPUT%"=="n" goto no echo Incorrect input & goto Ask :yes ... ,返回显示提示符并请求输入的脚本的开头,或者在跳转之前添加另一个ECHO命令,说明输入不正确,如下所示:

{{1}}

注意:@xmjx在答案中也提到了这里提到的一些问题,我完全承认这一点。

答案 1 :(得分:6)

我只是这样做:

set /p input= yes or no
if %input%==yes echo you clicked yes
if %input%==no echo you clicked no
pause

答案 2 :(得分:2)

这是一个有效的例子:

@echo off
:ask
@echo echo Would you like to use developer mode?(Y/N)
set INPUT=
set /P INPUT=Type input: %=%
If /I "%INPUT%"=="y" goto yes 
If /I "%INPUT%"=="n" goto no
goto ask
:yes
@echo you select yes
goto exit
:no
@echo you select no
goto exit
:exit
@pause

答案 3 :(得分:1)

我改进了批处理文件,出现是或否提示。如果用户输入y和n以外的任何字符,则它将再次提示用户输入有效的字符。这个对我有用。

    @echo off

    :ConfirmBox 
        set /P c= Are you sure want to contine (y/n)?

    if /I "%c%" EQU "Y" (
    goto :FnYes 
    ) else if /I "%c%" EQU "N" ( 
    goto :FnNo
    ) else ( 
    goto :InValid 
    )


:FnYes
     echo You have entered Y
     goto :END

:FnNo
     echo You have entered N
     goto :END

:InValid
     echo Invalid selection. Enter Y or N
     goto :ConfirmBox

:END
    pause
    exit  

/ I in if条件将同时验证小写和大写字符。

答案 4 :(得分:0)

我不知道您正在执行此操作的平台,但由于.bat扩展名,我认为是Windows。

此外,我没有办法检查这一点,但这似乎是批处理器由于某些错误而跳过If行,然后使用-dev执行该行。

您可以通过将两个跳转目标(:yes:no)与代码一起进行处理来尝试此操作。如果那时没有执行-dev的行你知道你的If行是错误的。

如果有,请检查==是否真的是在.bat文件中进行比较的正确方法。

另外,从bash执行此操作的方式来看,%foo=="y"只有在%foo包含引号时才会评估为true。所以也许"%foo"=="y"是可行的方法。

答案 5 :(得分:0)

echo off
setlocal
SET AREYOUSURE = N
:PROMPT
set /P AREYOUSURE=Update Release Files (Y/N)?
if /I %AREYOUSURE% NEQ Y GOTO END
set /P AREYOUSURE=Are You Sure you want to Update Release Files (Y/N)?
if /I %AREYOUSURE% NEQ Y GOTO END

echo Copying New Files

:END

这是我经常使用的代码。我在本博客的示例中注意到使用了引号。如果将测试行更改为使用引号,则测试无效。

if /I %AREYOUSURE% NEQ "Y" GOTO END

我已经在XP,Vista,Win7和Win8上进行了测试。使用引号时都失败。

答案 6 :(得分:0)

根据Windows的版本,您可能会发现使用“选择”选项会有所帮助。据我所知,大多数(如果不是全部)x64版本都不支持它。 可以在SourceForge上以名称Choice.zip找到一个名为Choice.vbs的简单替换以及使用示例

答案 7 :(得分:-1)

在%INPUT%周围添加引号(“”),使其如下所示:

If "%INPUT%" == "y" goto yes
If "%INPUT%" == "n" goto no
If "%INPUT%" == "Y" goto yes
If "%INPUT%" == "N" goto no

答案 8 :(得分:-3)

试试这个比较

if "%INPUT%"=="y"...