If statement 批比较语句分解

If statement 批比较语句分解,if-statement,batch-file,goto,If Statement,Batch File,Goto,我有一个选择菜单,由于某种原因正在崩溃。守则: : uninstallerMenu echo REMOVE ME! total items %count% set uninstallNr= set /P uninstallNr=Please select a number: echo %uninstallNr% if /I %uninstallNr% LEQ %count% goto uninstaller if /I '%uninstallNr%'=='M' goto menu :: U

我有一个选择菜单,由于某种原因正在崩溃。守则:

: uninstallerMenu
echo REMOVE ME!  total items %count%
set uninstallNr=
set /P uninstallNr=Please select a number:  
echo %uninstallNr%
if /I %uninstallNr% LEQ %count% goto uninstaller
if /I '%uninstallNr%'=='M' goto menu
:: Uninstaller Error Handler
: uninstallerError
cls
echo.
echo ==================== INVALID INPUT ====================
echo _______________________________________________________
echo.
echo    Please select a number or 'M' to go to Main Menu
echo _______________________________________________________
echo.
echo ============== PRESS ANY KEY TO CONTINUE ==============
pause>null
cls
if '%opt%'=='64' goto progList64
if '%opt%'=='32' goto progList32
goto menu
问题在于小于或等于检查。如果我放入%uninstallRn%LEQ%count%,它将检查它并将其发送到卸载程序(如果为真),按M键执行它应该执行的操作,但按enter键会破坏脚本

现在如果我加上

if '%uninstallNr%'=='' goto uninstallerError
以前

if /I %uninstallNr% LEQ %count% goto uninstaller
if /I '%uninstallNr%'=='M' goto menu
然后一切都转到卸载错误部分?!?!我做错了什么?

没什么问题

可能

if not defined uninstallnr goto wherever
比引用的版本好。YMMV

第二,如果使用
if/I
,则会逐字符进行比较,因此“12”小于“2”,因为“1”小于“2”

第三,批处理只是通过标签进行充电,因此,如果您的if语句由于条件不正确而无法转到任何位置,那么批处理只需在
:uninstallerError
标签上继续,顺便说一句,该标签可能不包含空格,,,至少,如果您打算将其用作
转到的目标位置,
(或就此问题致电)

Oh-和双引号是定义字符串的方法。只有当变量不包含空格(和其他一些字符)时,使用单引号或
[]
才有效

另外,它不是
null
,而是
nul
(您需要创建一个名为
null
的文件)


AIUI,您当前的代码是

SETLOCAL
SET count=3
set uninstallNr=
set /P uninstallNr=Please select a number:  
echo %uninstallNr%
if '%uninstallNr%'=='' goto uninstallerError
if /I %uninstallNr% LEQ %count% goto uninstaller
if /I '%uninstallNr%'=='M' goto menu
:: Uninstaller Error Handler
:uninstallerError
ECHO AT uninstallererror
GOTO :eof
:uninstaller
ECHO AT uninstaller
GOTO :eof
:menu
ECHO AT menu
GOTO :eof
或类似的

我已经设置了内联计数

输入1、2或3会很高兴地进入卸载程序。m进入菜单,否则进入卸载错误


(考虑输入“0”…但这是一个次要问题…)

您应该用双引号替换所有单引号,然后再试一次。这适用于十几个其他单引号脚本,我认为这与LEQ语句有关,但不确定这会对它产生什么影响。因为如果我去掉它,一切正常(除了我没有办法测试数字)这不起作用:
如果'%uninstallNr%'==''转到uninstallerError
。这是胡说八道。是的,它需要将引号一起删除,如果你看其他编码结构,它是有意义的,它只是在我尝试做的这个应用程序中不起作用。最初的目标是,如果你按enter键,那么你就不符合要求小于菜单总计数或按M键进入错误提示,这也意味着,如果您输入的数字超过计数器,您也会进入计数器,我添加标签的唯一原因是在该标签不起作用时跳到它。这在除此之外的其他任何地方都有效,一旦我添加了LEQ语句,整个事情就消失了ll partition.ok,我在goto菜单部分下添加了如果未定义%uninstallNr%goto uninstallerError,但它仍然不起作用,我确实注意到了一些问题,我收到一个错误,说%count%是它的中断位置。此实例中的计数是9项,表示“9在此时是意外的”好吧,我是哑巴,变量前后都没有%uninstallNr goto uninstallerErrormeh-发生在我们所有人身上。