Пакетный скрипт SET / p без значения - PullRequest
2 голосов
/ 13 сентября 2011

Создание пакетного скрипта в 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, она выдаст эхо и вернется в главное меню, как и должно ... ТОГДА, если вы просто нажмете ввод без введенного значения, он будет эхом и вернется в главное менюдолжен.

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

Ответы [ 2 ]

4 голосов
/ 13 сентября 2011

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

SET choice=none

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

IF %choice% EQU none (
   (ECHO You did not select an option.) & PAUSE & GOTO:mainmenu
)
3 голосов
/ 13 сентября 2011

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

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

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

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

...