Разбивка сравнительного отчета по партиям

У меня есть меню выбора, которое по какой-то причине ломается. Код:

: 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 делает то, что должно делать, но нажатие клавиши ввода прерывает сценарий.

Теперь, если я добавлю

if '%uninstallNr%'=='' goto uninstallerError

до

if /I %uninstallNr% LEQ %count% goto uninstaller
if /I '%uninstallNr%'=='M' goto menu

Дальше все уходит в раздел uninstallerError?!?! Что я делаю не так?


person Flynn    schedule 10.04.2013    source источник
comment
вы должны заменить все одинарные кавычки двойными кавычками и повторить попытку.   -  person Endoro    schedule 10.04.2013
comment
это работает примерно в дюжине других сценариев с одинарными кавычками, я думаю, что это как-то связано с оператором LEQ, но не знаю, как это на него влияет. Потому что, если я уберу это, все будет работать нормально (за исключением того, что у меня нет возможности проверить числа)   -  person Flynn    schedule 10.04.2013
comment
это не работает: if '%uninstallNr%'=='' goto uninstallerError. Это ерунда.   -  person Endoro    schedule 10.04.2013
comment
да, нужно было удалить кавычки все вместе, если вы посмотрите на другие структуры кодирования, это имеет смысл, просто это не работает в этом приложении, которое я пытаюсь сделать.   -  person Flynn    schedule 11.04.2013


Ответы (1)


Несколько проблем.

Возможно

if not defined uninstallnr goto wherever

лучше цитируемой версии. YMMV.

Во-вторых, если вы используете IF /I, то сравнение выполняется посимвольно, поэтому «12» меньше, чем «2», потому что «1» меньше, чем «2».

И в-третьих, пакет просто заряжается прямо через метки, поэтому, если ваши операторы IF никуда не переходят, потому что условие не было истинным, тогда пакет просто продолжится по метке :uninstallerError, которая, кстати, может НЕ включать пробел, ,,по крайней мере, если вы собираетесь использовать его в качестве пункта назначения для GOTO (или CALL в этом отношении)

О, и двойные кавычки - это способ определить строку. Использование одинарных кавычек или [] работает только тогда, когда переменная НЕ содержит пробелов (и несколько других символов)

Кроме того, это не 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

Или похожие.

Я установил COUNT в строку.

Ввод 1,2 или 3 благополучно переходит в УДАЛЕНИЕ. m в Меню, а в противном случае — в УДАЛИТЬ.

(рассмотрите запись «0», пока вы на ней... но это побочный вопрос...)

person Magoo    schedule 10.04.2013
comment
Первоначально цель заключалась в том, что если вы нажмете Enter, то вы не выполните требование меньшего, чем общее количество меню, или нажмете M, что приведет к подсказке об ошибке, что также означало, что если вы введете любое число больше, чем счетчик, вы также пошел к нему, единственная причина, по которой я добавил этот ярлык, заключалась в том, чтобы перейти к нему, когда он не работал. Это работает везде, кроме здесь, как только я добавил этот оператор LEQ, все развалилось. - person Flynn; 10.04.2013
comment
хорошо, я добавил, если не определен, %uninstallNr% goto uninstallerError в части меню goto, и он все еще не работает, хотя я кое-что заметил, я получаю сообщение об ошибке, говорящее, что %count% - это место, где он ломается. Количество в этом экземпляре составляет 9 элементов, это говорит о том, что 9 было неожиданным в это время. - person Flynn; 10.04.2013
comment
хорошо, я тупой, нет% до и после переменной: если не определено uninstallNr goto uninstallerError - person Flynn; 10.04.2013
comment
Мех - случается со всеми нами. - person Magoo; 11.04.2013