批处理脚本SET / p没有值

时间:2011-09-13 17:30:45

标签: variables batch-file windows-xp command-line-interface

在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 个答案:

答案 0 :(得分:4)

您可以在choice之前将set /p初始化为某个无效值,例如:

SET choice=none

要打印相应的错误消息,您可以执行

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

答案 1 :(得分:3)

如果用户未输入文本,则设置/ p不会更改变量的内容 因此,您只需将变量设置为空即可检测用户是否输入任何内容 设置“choice =”

或者您可以使用errorlevel,因为如果输入为空,则设置为1 但是要小心,因为它没有将它重置为0.所以你必须先自己强制它。

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

你应该使用延迟扩展的变量,因为它总是安全的。  否则,用户可以使用“& exit”等输入来破坏脚本