【问题标题】:cmd error: goto was unexpected at this time [closed]cmd错误:此时goto出乎意料[关闭]
【发布时间】:2016-05-07 20:54:47
【问题描述】:

我只是在学习如何在 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

【问题讨论】:

  • 我回滚了您的编辑,因为您删除了进行该编辑时存在的问题。收到问题的答案后,您无法对问题进行实质性更改,因为您可以通过更改使这些答案无效。
  • :: 是一个标签。注释命令为REM 用于备注。从正确而不是错误地开始做事。
  • 是的,你不能在“文档”中的任何地方告诉我它也不支持不。那是因为该语言的文档极差(事实上,唯一的官方文档来自help 命令——即使 ss64 也是非官方的)。看,我也可以转移举证责任,尽管这并没有使它成为一个谬误的论点。我给了你一个链接,指向可用的最佳解释之一。如果您了解该问题中列出的注意事项,那么您就可以使用任一选项。
  • 我承认在某些情况下rem 有效而:: 无效,并且与任何语言一样,在使用它们之前应该注意陷阱。但几十年来,:: 一直是一种广为人知和接受的在批处理文件中添加评论的方式。虽然您可能会考虑在某些情况下使用 :: 来打自己的脚,但在这种语言中,它几乎算不上致命的伤口,可以让您以多种方式比喻性地炸掉自己的腿。
  • 事实上,有这么多更好的替代批量预安装在 Windows 上(VBScript、PowerShell、bash 很快),还有这么多其他的快速安装,可以说 Teaching人们批量做事情是错误的,我们应该警告人们完全远离该语言,而不是对其评论语句的纯度提出质疑。

标签: batch-file cmd goto


【解决方案1】:

正如其他人在这里指出的那样,您的问题是您设置了一个名为var 的变量,然后尝试读取一个名为answer 的变量。根本的解决办法是选择一个名字并坚持下去。但是,我想提供另外两个指针。

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

其次,您的批处理文件终止的原因是语法错误。在未设置 answer 变量的情况下,您的 if 语句评估为

if == 1 goto nothing

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

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

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

【讨论】:

    【解决方案2】:

    您没有要比较的%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,但它仍然不起作用,然后我在这里上传时忘记更新它。对不起。它没有正确更新,但它仍然无法正常工作
    • 啊!现在它可以工作了....加载了错误的文件。谢谢
    【解决方案3】:
    ::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
    

    这应该可行。

    【讨论】:

      【解决方案4】:

      试试这个: 在这里,我设置了 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
      

      【讨论】:

      • 这不是 shell。这是一个 Windows 批处理文件,goto 肯定存在..
      • 抱歉误会,我已经更新了我的答案。
      • 纯代码的答案非常不受欢迎。您至少应该解释您所做的更改以及为什么它符合提问者的要求。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多