3

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

有两个问题: 1) 输入的不是指定选项之一的输入会导致脚本跳转到随机区域。并且 2)即使我知道语法和标志使用通常是正确的,某些使用外部程序的部分也不会占用用户 %input% (例如,我可以手动运行它们......所以由于某种原因输入不是t 捕捉它们)。

第一个问题示例:

: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”,我希望脚本给出错误并重复菜单。相反,它会在其他菜单周围晃动。我猜我需要一些 ELSE 语句?有没有人可以用一个例子来完成这个?

某些命令的第二个问题没有正确使用 %input% 并返回错误,就好像它从未收到 %input% 一样。

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

谢谢!

4

2 回答 2

0

在您编写的程序中,您的所有选择都将落入下一个。如果没有输入相关选项,它将运行: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)。一个好处是它不区分大小写,因此您不必担心同时检查Qq

于 2013-05-15T21:55:40.023 回答
0

更好地使用choicehttp://ss64.com/nt/choice.html),因为它会一直存在,直到您设置正确的输入

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

然而,仍然可以使用 IF 来完成

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正确使用(变量的名称应该在前面),或者您正在尝试我不理解的东西(使用输入变量的地方):

set /P testone=[Testone Input]:
set /P testtwo=[Testtwo Input]:
commandtorun.exe -f %testone% -h %testtwo% 
于 2013-05-15T21:57:44.390 回答