Пакетный скрипт SET /p без значения

Создание пакетного сценария в Windows XP. Вот фрагмент кода, с которым у меня проблемы:

::==============================================================::
::How many scripts are included in this program?
SET NumOfScripts=4
::==============================================================::

:mainmenu
CLS
ECHO [MAIN MENU]
ECHO Please choose from the following options to run a particular script:
set /p choice="[1] SCRIPT1.bat | [2] SCRIPT2.bat | [3] SCRIPT3.bat | [4] SCRIPT4.bat  :  "

IF %choice% EQU 1 CALL :SCRIPT1
IF %choice% EQU 2 CALL :SCRIPT2
IF %choice% EQU 3 CALL :SCRIPT3
IF %choice% EQU 4 CALL :SCRIPT4

REM Wrong Choices
IF %choice% GTR %NumOfScripts% (
 (ECHO You have entered an invalid option. Please press any key to be taken back to the main menu.) & PAUSE & GOTO:mainmenu
)
IF %choice% LEQ 0 (
 (ECHO You have entered an invalid option. Please press any key to be taken back to the main menu.) & PAUSE & GOTO:mainmenu
)
ECHO You have entered an invalid option. Please press any key to be taken back to the main menu 
PAUSE & GOTO:mainmenu

Глядя на REM Wrong Choice, первые два аргумента работают так, как должны, однако, если пользователь не вводит значения (просто нажимает клавишу ввода), скрипт автоматически завершает работу. Я добавил IF NOT DEFINED choice, и это не работает... Я также пробовал IF [%choice%]==[] и IF [%choice%] EQU [], и они тоже не работают.

Вот забавная вещь... вы вводите недопустимую цифру, скажем, 5 или -1, она даст эхо и вернется в главное меню, как и должно... ТОГДА, если вы просто нажмете ввод без вставленного значения, она будет echo и вернитесь в главное меню, как следует.

Мой вопрос: как заставить его распознать, что пользователь не ввел значение для set /p с первого раза?


person Anthony Miller    schedule 13.09.2011    source источник
comment
Оба ответа верны, однако решение mizo является самым безопасным. Забавно... такое простое исправление, но я совершенно его упустил =P   -  person Anthony Miller    schedule 14.09.2011


Ответы (2)


Вы можете инициализировать choice некоторым недопустимым значением перед set /p, например:

SET choice=none

Чтобы напечатать соответствующее сообщение об ошибке, вы можете сделать

IF %choice% EQU none (
   (ECHO You did not select an option.) & PAUSE & GOTO:mainmenu
)
person makes    schedule 13.09.2011

Параметр /p не изменяет содержимое переменной, если пользователь не вводит текст.
Таким образом, вы можете просто установить для своей переменной значение "ничего", чтобы определить, вводит ли пользователь что-либо.
Установите "choice="

Или вы можете использовать уровень ошибки, так как он устанавливается в 1, если ввод пуст,
Но будьте осторожны, так как он не сбрасывает его в 0. Так что вы должны сделать это самостоятельно раньше.

cd.
Set /p choose=
If %errorlevel%==1 goto empty

И вы должны использовать переменные с отложенным расширением, так как это всегда безопасно. В противном случае пользователь может сломать ваш скрипт вводом типа «&exit».

person jeb    schedule 13.09.2011
comment
Вы хотели сказать: «Set /p не меняется...»? Просто не могу следовать за вами туда. - person Andriy M; 13.09.2011
comment
Да, мой HTC решил, что директ - лучший выбор :-) - person jeb; 13.09.2011
comment
Следует либо добавить сброс уровня ошибки, либо уровень ошибки следует проверять после всех или большинства других проверок. В противном случае поведение может быть неожиданным. Вот сценарий. Пользователь вводит пустой ввод. Уровень ошибки повышен. В следующий раз они введут правильный ввод. Но уровень ошибки остается повышенным, и ввод снова считается пустым. И так далее. Думаю, If %errorlevel%==1 (verify>nul & goto empty) может помочь. (Вот оно! Чтение ваших ответов может быть очень поучительным!) - person Andriy M; 14.09.2011
comment
Спасибо. И я забыл отметить, что cd. также сбрасывает уровень ошибки, поэтому он помещается непосредственно перед set/p - person jeb; 14.09.2011
comment
Упс, я совсем проглядел. Тогда вроде все в порядке! - person Andriy M; 14.09.2011