Batch file cmd错误:此时转到意外

Batch file cmd错误:此时转到意外,batch-file,cmd,goto,Batch File,Cmd,Goto,我只是在学习如何用cmd编写代码,但由于某些原因,那里的教程在我的电脑上不起作用。我试图运行下面的程序,但它总是失败 ::My first program @echo off :main menu cls echo what are you doing? echo. echo 1) Nothing :-P echo 2) dancing echo. set /p var="Choose answer:" if %answer% == 1 goto nothing if %answer% =

我只是在学习如何用cmd编写代码,但由于某些原因,那里的教程在我的电脑上不起作用。我试图运行下面的程序,但它总是失败

::My first program

@echo off
:main menu
cls
echo what are you doing?
echo.
echo 1) Nothing :-P
echo 2) dancing
echo. 
set /p var="Choose answer:" 
if %answer% == 1 goto nothing
if %answer% ==2 goto dancing

:nothing
echo ok...chill

:dancing
echo nice

echo on

您没有要比较的
%answer%
,因为您将问题的答案输入到
var
中。将
set/p
更改为使用
answer

set /p answer="Choose answer:" 
if %answer% == 1 goto nothing
if %answer% ==2 goto dancing
或者将两个if语句更改为使用
var

set /p var="Choose answer:" 
if %var% == 1 goto nothing
if %var% ==2 goto dancing

您没有要比较的
%answer%
,因为您将问题的答案输入到
var
中。将
set/p
更改为使用
answer

set /p answer="Choose answer:" 
if %answer% == 1 goto nothing
if %answer% ==2 goto dancing
或者将两个if语句更改为使用
var

set /p var="Choose answer:" 
if %var% == 1 goto nothing
if %var% ==2 goto dancing
试试这个: 在这里,我为输入和比较设置了var

  : : My first program
  @echo off
  :main menu
  cls
  echo .
  echo .
  echo what are you doing?
  echo 1) Nothing :-P
  echo 2) dancing
  echo .
  echo .
  echo choose answer:
  set /p var=
  IF %var%== 1 goto nothing
  IF %var%== 2 goto dancing

  :nothing
  echo ok...chill

  :dancing
  echo nice

  echo on
试试这个: 在这里,我为输入和比较设置了var

  : : My first program
  @echo off
  :main menu
  cls
  echo .
  echo .
  echo what are you doing?
  echo 1) Nothing :-P
  echo 2) dancing
  echo .
  echo .
  echo choose answer:
  set /p var=
  IF %var%== 1 goto nothing
  IF %var%== 2 goto dancing

  :nothing
  echo ok...chill

  :dancing
  echo nice

  echo on

正如其他人在这里指出的,您的问题是设置了一个名为
var
的变量,然后尝试读取一个名为
answer
的变量。根修复是选择一个名称并坚持使用它。然而,我想提供另外两个要点

首先,调试批处理文件时,从文件顶部删除行
@echo off
。启用echo后,您可以准确地看到出错时执行的是哪一行,这将使您更快地找到解决方案

其次,批处理文件终止的原因是语法错误。使用
answer
变量unset,您的
if
语句的计算结果为

if == 1 goto nothing
这是无效的批处理语法,这是导致错误“goto此时意外”并导致批处理文件终止的原因如果用户输入一个空白字符串,即使修复了错误变量名的问题,您的代码仍然会出现此错误。要正确处理IF语句中的空变量,请在
=
的每一侧放置括号或引号,如下所示:

if [%answer%]==[1] goto nothing

这样,即使变量是空字符串,if的计算结果也是
if[]=[1]goto nothing
,这仍然是一个有效语句,因此不会使脚本崩溃。

正如其他人在这里指出的,您的问题是设置了一个名为
var
的变量,然后尝试读取一个名为
answer
的变量。根修复是选择一个名称并坚持使用它。然而,我想提供另外两个要点

::My first program

@echo off
:mainmenu
cls
echo what are you doing?
echo.
echo 1) Nothing :-P
echo 2) dancing
echo. 
set /p answer="Choose answer: " 
if %answer%==1 goto nothing
if %answer%==2 goto dancing

:nothing
echo ok...chill
pause
goto mainmenu

:dancing
echo nice
pause
goto mainmenu
首先,调试批处理文件时,从文件顶部删除行
@echo off
。启用echo后,您可以准确地看到出错时执行的是哪一行,这将使您更快地找到解决方案

其次,批处理文件终止的原因是语法错误。使用
answer
变量unset,您的
if
语句的计算结果为

if == 1 goto nothing
这是无效的批处理语法,这是导致错误“goto此时意外”并导致批处理文件终止的原因如果用户输入一个空白字符串,即使修复了错误变量名的问题,您的代码仍然会出现此错误。要正确处理IF语句中的空变量,请在
=
的每一侧放置括号或引号,如下所示:

if [%answer%]==[1] goto nothing
这样,即使变量是空字符串,if的计算结果也是
if[]=[1]goto nothing
,这仍然是一条有效语句,因此不会使脚本崩溃

::My first program

@echo off
:mainmenu
cls
echo what are you doing?
echo.
echo 1) Nothing :-P
echo 2) dancing
echo. 
set /p answer="Choose answer: " 
if %answer%==1 goto nothing
if %answer%==2 goto dancing

:nothing
echo ok...chill
pause
goto mainmenu

:dancing
echo nice
pause
goto mainmenu
这应该行得通



这应该可以用。

是的,对不起,我以前有答案,它不起作用,所以我把它改成了var,但它仍然不起作用,然后我在上传到这里时忘记了更新它。很抱歉它没有正确更新,但它仍然不能工作啊!现在它起作用了。。。。加载了错误的文件。谢谢,对不起,我以前有答案,它不起作用,所以我把它改成了var,但它仍然不起作用,然后我在这里上传时忘了更新它。很抱歉它没有正确更新,但它仍然不能工作啊!现在它起作用了。。。。加载了错误的文件。谢谢这不是贝壳。这是一个Windows批处理文件,
goto
肯定存在。抱歉误解,我已更新了我的答案。只使用代码的答案是非常不受欢迎的。你至少应该解释一下你改变了什么,以及为什么它符合询问者的要求。这不是壳牌。这是一个Windows批处理文件,
goto
肯定存在。抱歉误解,我已更新了我的答案。只使用代码的答案是非常不受欢迎的。你至少应该解释一下你改变了什么,以及为什么它符合询问者的要求。我回滚了你的编辑,因为你删除了编辑时存在的问题。在收到问题的答案后,您不能对其进行实质性更改,因为您可以通过更改使这些答案无效。
是一个标签。备注命令为REM。从正确的开始,而不是错误的开始。是的,你不能在“文档”中的任何地方告诉我它也不受支持。这是因为该语言的文档非常糟糕(事实上,唯一的官方文档出现在
help
命令中,甚至ss64也是非官方的)。看,我也可以转移举证责任,尽管这并不能减少它的谬误。我给了你一个链接,可以找到最好的解释之一。如果你理解了这个问题中概述的注意事项,你就知道可以使用这两种方法。我承认,在某些情况下,
rem
有效,而
无效。与任何语言一样,在使用它们之前,你都应该了解其中的陷阱。但是,
在批处理文件中添加注释已经被广泛理解和接受了几十年。在某些情况下,你可以考虑使用<代码>:在你的脚上射击,这几乎不是语言中致命的创伤,它允许你用许多方式来比喻你自己的腿。事实上,有这么多更好的ALT。