我在Windows上发现了批处理脚本的非常奇怪的行为。为什么第一个示例崩溃,而其他示例在按 Enter 时没有崩溃?
如果您只是按回车键而没有任何内容,这将崩溃。
@echo off
set /p menuinput=
if "%menuinput%"=="" (
Echo just enter input
pause
) else if "%menuinput:~2,2%"==":" (
echo A destination path has been input with quotations.
pause
) else (
echo anything else
pause
)
exit
但是即使您只是按回车键而没有任何内容,这也不会崩溃。
@echo off
set /p menuinput=
if "%menuinput%"=="" (
Echo just enter input
pause
) else (
echo anything else
pause
)
exit
此外,即使您只是按回车键而没有任何内容,这也不会崩溃。
@echo off
set menuinput=""
set /p menuinput=
if "%menuinput%"=="" (
Echo just enter input
pause
) else if "%menuinput:~2,2%"==":" (
echo A destination path has been input with quotations.
pause
) else (
echo anything else
pause
)
exit
实际上,你的第三个例子很重要,所以我把它回滚了。
第一个示例崩溃的原因是,如果menuinput
为空,则else if "%menuinput:~2,2%"==":" (
将产生语法错误。第二个成功,因为您没有尝试查找空字符串的子字符串。
第三个 - 嗯,实际上,这对set
""
menuinput
.这不是一个空字符串。请注意,如果您只需按Enter键,set /p
将保持变量不变
Batch 从if
到 逻辑语句中的最后一个右括号解析整个语句,因此它会找到语法错误和 barfs。仅当语句在语法上正确且语句时,才会执行语句(当然,for
语句也是如此)。
如果您在set /p
之前使用set "menuinput="
,那么menuinput
将被"设置">为零
尝试可靠地解析set /p
输入值充满了问题。
因此,要检测just-Enter,请将变量设置为 nothing,然后执行set /p
然后使用
if not defined menuinput goto noinput
然后解决进一步分析输入字符串的问题。
经常讨论运行适当的菜单 - SO 上有很多项目 - 只需使用search
功能即可。(我提到这个只是因为你使用的变量名)
此外,您似乎正在使用pause
尝试在窗口关闭之前捕获窗口。使用点单击和咯咯笑方法执行批处理时,如果发现语法错误,批处理窗口通常会关闭。相反,您应该打开"命令提示符"并从那里运行批处理,以便窗口保持打开状态并显示任何错误消息。