仅使用预定义符号将Windows批处理脚本中的用户输入限制为

时间:2018-10-09 13:35:35

标签: windows cmd user-input winpe

我为WinPE编写了以下Windows批处理脚本,以使某些任务更容易:

@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中,脚本将仅执行下一个可用的批处理标签,这绝对不行。

我想在1234的范围内,使用一个符号来限制用户输入INPUTCHOICES,从RS的范围开始,RB_OR_SD

最好使用户输入不区分大小写。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

我不确定我是否完全了解您要达到的目标,但是我认为这可能会为您提供帮助:

ReceiveMessagesFromRabbitMQ.js

答案 1 :(得分:0)

只是限制自己回答您的问题,而不对您的代码进行任何更改/编辑...

使用 findstr 检查是否输入:

if [length == 1]  /be [begin/end]  with one number [1,2,3,4] and operator || == return non 0 

setlocal EnableDelayedExpansion

:menu
cls & setlocal & set "_quit=false"
set /p "_input=type 1, 2, 3 or 4 and press enter: " || goto :menu
<con: echo\%_input%| 2>nul %__AppDir__%findstr.exe/be [1-4] >nul || goto :menu

the command here only execute if findstr command return 0

如果输入fail goto :menu 如果输入不在游侠1-4 goto :menu

r b case-insensitive 类似:

setlocal EnableDelayedExpansion

:menu
cls & setlocal & set "_quit=false"
set /p "_input=type r or s and press enter: " || goto :menu
<con: echo\%_input%| 2>nul %__AppDir__%findstr.exe/be "r s" >nul || goto :menu

the command here only execute if findstr command return 0

@ECHO OFF

CLS
cd /d "%~dp0"
SetlocaL EnableDelayedExpansion

:MENU
SET "QUIT=FALSE"
set "INPUTCHOICES="

2>nul (
SET /P "INPUTCHOICES=Type: 1, 2, 3 or 4 & press [ENTER] "
) || goto :MENU 

2>nul (
echo\!INPUTCHOICES!| findstr /rbe [1-4] >nul
) || goto :MENU 

for /l %%i in (1 1 4)do if %%i equ !INPUTCHOICES! CALL :%%i

ENDLOCAL

GOTO :EOF

:1
cls
set "RB_OR_SD="

2>nul (
SET /P "RB_OR_SD=Type R to reboot or type S to shutdown your PC when done, and press ENTER: "
) || goto :1

2>nul (
echo\!RB_OR_SD!| findstr /be "R S" >nul
) || goto :1

ECHO Performing task 1
ECHO.
pause
IF "%RB_OR_SD%"=="R" (GOTO %:^3)else GOTO %:^4

:2
cls
set "RB_OR_SD="

2>nul (
SET /P "RB_OR_SD=Type R to reboot or type S to shutdown your PC when done, and press ENTER: "
) || goto :2

2>nul (
echo\!RB_OR_SD!| findstr /be "R S" >nul
) || goto :2

ECHO Performing task 2
ECHO.
pause
IF "%RB_OR_SD%"=="R" (GOTO %:3)else GOTO %:4

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

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