【问题标题】:Why does pressing "Enter" close the batch file only on the first press?为什么按“Enter”仅在第一次按下时关闭批处理文件?
【发布时间】: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


【解决方案1】:
@echo off
setlocal EnableDelayedExpansion

:menu
echo A: Hello
set /p _input=Choice? 
if /i "%_input%"=="" cls & goto :menu
if %_input%==A goto hello
goto menu

:hello
echo Hello!
pause
exit

【讨论】:

  • 你应该解释为什么会这样,而不是仅仅转储一段代码。
  • 答案很棒。但对于最佳实践,请提供解释。您只发布代码会使 OP 和未来的 commers 复制并粘贴您的答案,而不了解答案背后的逻辑。请提供一些解释的答案。谢谢!
猜你喜欢
  • 2013-03-13
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 2011-06-14
  • 2021-03-16
  • 2017-05-18
  • 2019-08-15
  • 1970-01-01
相关资源
最近更新 更多