Ограничить пользовательский ввод в пакетном скрипте Windows только предопределенными символами - PullRequest
0 голосов
/ 09 октября 2018

Я написал следующий пакетный скрипт Windows для WinPE, чтобы упростить некоторые задачи:

@ECHO OFF
CLS

:MENU
SETLOCAL
SET QUIT=FALSE
SET /P INPUTCHOICES=Type 1, 2, 3 or 4 and press ENTER: 
CALL :EXECUTECHOICES %INPUTCHOICES%
ENDLOCAL

GOTO :EOF

:EXECUTECHOICES
IF [%1]==[] (GOTO :MENU) ELSE (CALL :%1)
SHIFT
GOTO :EXECUTECHOICES

GOTO :EOF

:1
cls
SET /P RB_OR_SD=Type R to reboot or type S to shutdown your PC when done, and press ENTER: 
ECHO Performing task 1
ECHO.
pause
IF "%RB_OR_SD%"=="R" (GOTO :3)
IF "%RB_OR_SD%"=="S" (GOTO :4)
ELSE (GOTO :3)

:2
cls
SET /P RB_OR_SD=Type R to reboot or type S to shutdown your PC when done, and press ENTER: 
ECHO Performing task 2
ECHO.
pause
IF "%RB_OR_SD%"=="R" (GOTO :3)
IF "%RB_OR_SD%"=="S" (GOTO :4)
ELSE (GOTO :3)

:3
cls
ECHO The system will now reboot
ECHO.
pause
GOTO :MENU

:4
cls
ECHO The system will now shutdown
ECHO.
pause
GOTO :MENU

GOTO :EOF

Этот сценарий работает нормально, пока пользователь не введет что-либо кроме 1, 2, 3,4, R или S.

В случае INPUTCHOICES любой неправильный символ просто приводит к «Системе не удается найти сообщение с указанием метки партии» , и приглашение перезагружается.

Но в случае помещения чего-либо, кроме R или S, в RB_OR_SD сценарий просто выполняет следующую доступную метку пакета, что совершенно не в порядке.

Я хочу ограничить пользовательский ввод точно один символ из области 1, 2, 3 и 4 для INPUTCHOICES и из области R и S для RB_OR_SD.

Желательно, чтобы пользовательский ввод не учитывал регистр.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 16 октября 2018

Я не совсем уверен, что понимаю, чего вы пытаетесь достичь, но я думаю, что это может вам помочь:

:MENU
CLS
SETLOCAL
SET QUIT=FALSE
SET /P INPUTCHOICES=Type 1, 2, 3 or 4 and press ENTER:
CALL :VALIDATOR
ENDLOCAL

:validator
call :check 1
call :check 2
call :check 3
call :check 4
call :check "R"
call :check "S"
GOTO MENU

:check
IF %INPUTCHOICES% == %~1 ( CALL :EXECUTECHOICES %INPUTCHOICES% )
exit /b 0
...