设置 /p 空答案崩溃,即使有引号(非常奇怪的行为)(在 Windows 上批处理)



我在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尝试在窗口关闭之前捕获窗口。使用点单击和咯咯笑方法执行批处理时,如果发现语法错误,批处理窗口通常会关闭。相反,您应该打开"命令提示符"并从那里运行批处理,以便窗口保持打开状态并显示任何错误消息。

最新更新