Batch file 为什么要按“;输入“;仅在第一次按下时关闭批处理文件?

Batch file 为什么要按“;输入“;仅在第一次按下时关闭批处理文件?,batch-file,crash,enter,Batch File,Crash,Enter,所以我注意到,当我启动批处理文件并出现用户提示时,如果第一次按下“Enter”,文件将终止。如果在第二次或随后的尝试中按“回车”,文件将正常运行(并再次按照转到返回菜单)。为什么会发生这种情况和/或我如何防止这种情况发生?我尝试使用暂停和超时,但垃圾邮件输入仍会使其崩溃 为了解释使用下面的代码,如果按下A,我们转到:hello。否则我们回到菜单。这适用于除enter之外的任何键。如果你按回车键,你就会崩溃。但如果您点击了其他内容,请单击“重新加载”菜单,然后再输入“重新加载” 示例代码如下: @

所以我注意到,当我启动批处理文件并出现用户提示时,如果第一次按下“Enter”,文件将终止。如果在第二次或随后的尝试中按“回车”,文件将正常运行(并再次按照转到返回菜单)。为什么会发生这种情况和/或我如何防止这种情况发生?我尝试使用暂停和超时,但垃圾邮件输入仍会使其崩溃

为了解释使用下面的代码,如果按下A,我们转到:hello。否则我们回到菜单。这适用于除enter之外的任何键。如果你按回车键,你就会崩溃。但如果您点击了其他内容,请单击“重新加载”菜单,然后再输入“重新加载”

示例代码如下:

@echo off

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

:hello
echo Hello!
pause
exit

因为IF命令变成了无效语法。在变量周围加引号<代码>如果“%\u输入%”==“A”转到hello很好,第一次按enter键时它就不会崩溃了。IF“是如何变成”无效语法的呢?具体来说,如果没有为
\u输入提供值(只需按enter键),则变量的值为空。因此它扩展为:
if==A goto hello
,这是无效的。通过引用@Squashman的建议,它变成:
如果“==”一个“goto hello
,这是有效的。实际上,
set/P
没有清除任何变量,当用户只按ENTER键时,它会保持变量的先前值,在这种情况下,它会将
ErrorLevel
设置为
1
;(如果输入了内容,
ErrorLevel
不会重置!)使用command从预定义列表(如菜单)中获取选项通常比使用
set/P
更好,在该列表中,批处理用户可以输入任何内容,包括由于用户输入字符串导致错误而导致批处理退出的字符串。您应该解释为什么会这样做,而不仅仅是扔掉一段代码。答案很好。但对于最佳实践,请提供解释。你只发布代码,让OP和未来的商业广告复制并粘贴你的答案,而不理解答案背后的逻辑。请提供一个答案并作一些解释。非常感谢。
@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