If statement 批处理脚本输入问题

If statement 批处理脚本输入问题,if-statement,input,batch-file,If Statement,Input,Batch File,关于我正在编写的批处理脚本,我有两个问题。我意识到批量脚本问题很常见,但还没有找到确切问题的答案,所以我想我应该试着问一下。问题区域是菜单上的用户输入部分 有两个问题:1)输入的不是指定选项之一的输入将导致脚本跳转到随机区域。2)即使我知道语法和标志使用通常是正确的,使用外部程序的某些部分也没有接受用户%input%(如中所示,我可以手动运行它们…因此出于某种原因,输入没有在它们上捕获) 第一期示例: :MenuOne echo Select one of the following optio

关于我正在编写的批处理脚本,我有两个问题。我意识到批量脚本问题很常见,但还没有找到确切问题的答案,所以我想我应该试着问一下。问题区域是菜单上的用户输入部分

有两个问题:1)输入的不是指定选项之一的输入将导致脚本跳转到随机区域。2)即使我知道语法和标志使用通常是正确的,使用外部程序的某些部分也没有接受用户%input%(如中所示,我可以手动运行它们…因此出于某种原因,输入没有在它们上捕获)

第一期示例:

:MenuOne
echo Select one of the following options:
echo 1) x
echo 2) y
echo Q) Quit

set INPUT=
set /P INPUT=[1,2,Q]: %=%
If "%INPUT%"=="1" goto xoption
If "%INPUT%"=="2" goto yoption
If /I "%INPUT%"=="Q" goto Quit

:xoption
@REM Here goes a lot more submenus and/or options that actually run tools via cmd.

:yoption
@REM Again, menus and/or tools being invoked, in a listed menu, designed like above.

:Quit
echo Quitting...
exit
如果用户在选择提示下键入“b”,我希望脚本给出一个错误并重复菜单。相反,它会在其他菜单上乱动。我猜我还需要一些其他的陈述?有没有人能举一个我可以用来实现这一目标的例子

第二个问题是某些命令未正确使用%input%,并返回错误,好像从未收到%input%

set /P INPUT=[Testone Input]: %testone%
set /P INPUT=[Testtwo Input]: %testtwo%
commandtorun.exe -f %testone% -h %testtwo% 

谢谢

在您编写的程序中,您所有的选择都将落到下一个选项中。如果未输入相关选项,它将运行
:xoption
:yoption
。执行以下操作后,每个操作都可能返回菜单:

:MenuOne
echo Select one of the following options:
echo 1) x
echo 2) y
echo Q) Quit

set INPUT=
set /P INPUT=[1,2,Q]: %=%
If "%INPUT%"=="1" goto xoption
If "%INPUT%"=="2" goto yoption
If /I "%INPUT%"=="Q" goto Quit

echo Invalid selection.
echo.
goto MenuOne

:xoption
@REM Here goes a lot more submenus and/or options that actually run tools via cmd.
goto MenuOne

:yoption
@REM Again, menus and/or tools being invoked, in a listed menu, designed like above.
goto MenuOne
确保做出有效选择的真正简单方法是使用
choice
命令,而不是
set/p
。这将强制用户输入一个值:

choice -c 12Q
echo %errorlevel%

choice
命令将返回所选字符的索引(上例中为1、2或3)。另一个好处是它不区分大小写,因此您不必担心同时检查
Q
Q
最好使用
choice
(),因为它会一直存在,直到您设置正确的输入

CHOICE /C XYQ /M "Select of the following options [X,Y,Q]"
if errorlevel 1 goto :x
if errorlevel 2 goto :y
uf errorlevel 3 goto :q
然而,使用IFs仍然是可能的

set INPUT=
set /P INPUT=[1,2,Q]: %=%
If "%INPUT%"=="1" goto xoption
If "%INPUT%"=="2" goto yoption
If /I "%INPUT%"=="Q" goto Quit
rem -- will be executed only if the all the above are not true
goto :eof
对于第二个问题..您没有正确使用
SET/p
(变量的名称应该在前面),或者您正在尝试我不理解的东西(使用输入变量的地方):


非常感谢。事实证明,我没有选择的余地。但你建议的其他一切都奏效了。非常感谢。注意:如果OP使用的是Windows XP,
choice
在默认情况下不可用。回答很好-我不敢相信我用错了set/P。你是对的,我基本上是通过不使用两个不同的变量来覆盖旧的输入。现在工作,非常感谢!编辑:正如michaelb958所说,我试过了。哦,好吧,回到set/P工作现在很好:)谢谢
set /P testone=[Testone Input]:
set /P testtwo=[Testtwo Input]:
commandtorun.exe -f %testone% -h %testtwo%