Variables 不带值的批处理脚本集/p

Variables 不带值的批处理脚本集/p,variables,batch-file,windows-xp,command-line-interface,Variables,Batch File,Windows Xp,Command Line Interface,在Windows XP中创建批处理脚本。以下是我遇到问题的一段代码: ::==============================================================:: ::How many scripts are included in this program? SET NumOfScripts=4 ::==============================================================:: :mainmenu CL

在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-error-Choice
,前两个参数正常工作,但是,如果用户不输入任何值(只需按enter键),它会自动终止脚本。我添加了
如果未定义选项
,但这不起作用。。。我还尝试了
IF[%choice%]=[]
IF[%choice%]eq[]
,但这些都不起作用

有趣的是。。。你输入一个无效的数字,比如说5或-1,它将发出回声并返回主菜单,因为它应该。。。然后,如果只按enter键而不插入值,它将按原样回显并返回主菜单


我的问题是,如何让它识别用户在第一次输入set/p时没有输入值?

如果用户没有输入文本,set/p不会更改变量的内容。
因此,您可以简单地将变量设置为nothing,以检测用户是否输入任何内容。
设置“选择=”

或者您也可以使用errorlevel,因为如果输入为空,它将设置为1
但要小心,因为它不会将其重置为0。所以你必须在之前强迫自己

cd.
Set /p choose=
If %errorlevel%==1 goto empty
您应该使用延迟扩展的变量,因为它总是安全的。
否则,用户可以使用诸如“&exit”之类的输入中断脚本。您可以在
设置/p
之前将
选项
初始化为某个无效值,例如:

SET choice=none
要打印相应的错误消息,可以执行以下操作

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

你的意思是说,‘设定/付款不变……’?是的,我的HTC认为“直接”是最好的选择:-)应该添加重置错误级别,或者在所有或大部分其他检查之后检查错误级别。否则,该行为可能是意外的。下面是一个场景。用户输入一个空输入。错误级别被提升。下次他们输入正确的输入时。但是errorlevel保持上升状态,输入再次被视为空。等等我猜,
如果%errorlevel%==1(verify>nul&goto empty)
可能会起作用。(好了!阅读你的答案真的很有教育意义!)谢谢。我忘了在那张cd上留言。也会重置errorlevel,因此它就放在set/pOops之前,我完全忽略了这一点。看来一切都井然有序!这两个答案都是正确的,但是mizo的解决方案是最安全的。虽然很有趣。。。这么简单的修正,但我完全忽略了它=P