Batch批处理中输入含not的内容为何跳过if else判断直接执行后续代码?
问题成因
- 变量未加引号导致if语法被篡改
你写的判断语句没有用引号包裹%input%变量,Batch在执行时会先展开变量再解析语句语法。当你输入开头为not的内容时,展开后的语句会匹配BatchIF语句的IF [NOT] 字符串1==字符串2 操作原生语法,原有判断逻辑被完全修改。
举个例子,当输入not test时,第一条判断if %input% == start goto Start会被展开为:
if not test == start goto Start
此时语句会被解析为「判断test是否不等于start」,该条件显然成立,会直接执行goto Start跳转,不会走到后续的else分支。如果输入内容包含其他Batch关键字或者特殊符号,还会出现更多不可预期的语法错误。
- else分支语法与绑定逻辑错误
你当前写的else分支只和最后一条if %input% == quit goto Exit的判断绑定,前面两条判断不成立时根本不会触发这个else。同时Batch语法要求else必须和前一个if的结束部分处于同一逻辑行,你换行写else (的写法本身就不符合规范,除非法式匹配否则else会被当作普通命令处理,无法触发对应跳转。
修复参考
你可以直接去掉冗余的else分支,同时给变量加引号避免语法被篡改,调整后的代码如下:
echo To Start, type start echo To view Options, type options echo To Quit Game, type quit set "input=" set /p input= Command? if /i "%input%" == "start" goto Start if /i "%input%" == "options" goto Options if /i "%input%" == "quit" goto Exit :: 所有判断不成立直接跳转回Menu goto Menu
内容的提问来源于stack exchange,提问作者ZeroTwoWaifu
相关产品推荐
相关产品推荐

