30

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

@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,我如何让它再次询问?

4

9 回答 9

40

如果输入是,比如说,N你的 IF 行评估如下:

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

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

因此,您需要"从 aroundy中删除nY或者N将它们%INPUT%放在您的条件语句中。我会推荐后者,因为这样你会转义至少一些在批处理脚本中具有特殊含义的字符(如果用户设法输入它们)。所以,这就是你应该得到的:

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

顺便说一句,您可以通过将/Iswitch 应用于IF语句来减少条件的数量,如下所示:

If /I "%INPUT%"=="y" goto yes 
If /I "%INPUT%"=="n" goto no

/I开关使比较不区分大小写,因此您不需要单独检查不同大小写的字符串。

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

...
: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

最后,为了解决处理错误输入的问题,您可以简单地在条件语句之后,标签goto之前添加另一个(无条件)命令,即返回到显示提示并且输入为的脚本开头请求,或者您也可以跳转之前添加另一个 ECHO 命令,说明输入不正确,如下所示:yesgoto 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
...

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

于 2012-08-18T19:55:59.210 回答
6

我只是做 :

set /p input= yes or no
if %input%==yes echo you clicked yes
if %input%==no echo you clicked no
pause
于 2013-12-23T23:27:05.153 回答
3

这是一个工作示例:

@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
于 2018-03-06T08:06:09.857 回答
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 条件将验证小写和大写字符。

于 2019-09-03T06:52:57.620 回答
0

我不知道您在哪个平台上执行此操作,但由于 .bat 扩展名,我假设是 Windows。

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

您可以通过更改两个跳转目标 (:yes:no) 以及代码来尝试此操作。如果然后执行没有 -dev 的行,您就知道您的 If 行是错误的。

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

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

于 2012-08-18T19:15:17.837 回答
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 上进行了测试。使用引号时全部失败。

于 2015-01-20T12:14:24.593 回答
0

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

于 2015-10-05T16:33:06.607 回答
-2

在 %INPUT% 周围添加引号 (" "),使其看起来像这样:

If "%INPUT%" == "y" goto yes
If "%INPUT%" == "n" goto no
If "%INPUT%" == "Y" goto yes
If "%INPUT%" == "N" goto no
于 2015-05-22T00:54:27.237 回答
-3

试试这个比较

if "%INPUT%"=="y"...
于 2014-02-21T11:34:14.157 回答