【发布时间】:2016-03-30 07:13:14
【问题描述】:
所以我注意到,当我启动批处理文件并进入用户提示时,如果“Enter”是按下的第一个键,则文件将终止。如果在第二次或后续尝试中按下“Enter”,文件将正常运行(并按照 goto 再次返回菜单)。为什么会发生这种情况和/或如何防止它发生?我尝试使用暂停和超时,但垃圾邮件输入仍然会使它崩溃。
为了解释使用下面的代码,如果按下 A,我们转到 :hello。否则我们返回:menu。这适用于除 enter 之外的任何键。如果你点击进入你会崩溃。但是,如果您点击其他内容,请重新加载菜单,然后也输入重新加载。
示例代码如下:
@echo off
:menu
echo A: Hello
set /p _input=Choice?
if %_input%==A goto hello
goto menu
:hello
echo Hello!
pause
exit
【问题讨论】:
-
因为 IF 命令变成了无效的语法。在变量周围加上引号。
if "%_input%"=="A" goto hello -
太好了,它阻止了它在第一次输入时崩溃。具体来说,IF 是如何“变成”无效语法的?
-
如果您没有为
_input提供值(只需按回车键),则该变量的值为空。所以它扩展为:if ==A goto hello这是无效的。通过引用@Squashman 的建议,它变为:if ""=="A" goto hello这是有效的。 -
实际上,
set /P不会清除任何变量,它会在用户按下 ENTER 时保持变量的先前值 ,在这种情况下,它将ErrorLevel设置为1; (如果输入了某些内容,ErrorLevel不会重置!) -
使用命令choice 从预定义列表(如菜单)中获取选项通常比使用
set /P更好,因为set /P批处理用户可以输入任何内容,包括导致批处理退出的字符串由于用户输入字符串引起的错误处理。
标签: batch-file crash enter