代码之家  ›  专栏  ›  技术社区  ›  Slimak

为什么即使标签存在也会抛出“系统找不到指定的批次标签”?

  •  47
  • Slimak  · 技术社区  · 17 年前

    系统找不到批标签指定的名称\u或\u标签

    7 回复  |  直到 8 年前
        1
  •  85
  •   VonC    5 年前

    实际上,发生这种情况需要两个条件:

    • 批处理文件不得使用CRLF行结尾
    • 跳转到的标签必须跨越块边界(与and:end label相反,and:end label只是指向脚本末尾的快捷方式)

    看见 The system cannot find the batch label specified Batch-as-batch-can!

    David A. Gray 提及 in the comments 看到(在Windows 10上)什么 Marshal answer 显示于2014年(可能在Windows 7或8上):一个脚本/批处理程序( .bat .cmd CALL

    在过去的35年中,我已经编写了数百个批处理脚本,我唯一一次遇到标签找不到的问题是文件的换行符从Windows(CR/LF)转换到Unix(LF),后者不工作。


    2020年2月, kinar in the comments :

    刚刚在Win7计算机上遇到此问题。
    事实证明,在尝试调用另一个时也会生成此错误 球棒
    在我的例子中,我试图给Visual Studio打电话 vcvarsall.bat 未安装VS的系统上的文件。

    jeb answer 更多信息:这是一个未定义标签的案例。


    .gitattributes 使用指令的文件:

    *.bat   text eol=crlf
    
        2
  •  47
  •   Nathan    12 年前

    我以前也遇到过同样的问题。然而,根本原因根本不是CRLF。这是因为在脚本中,我执行了一个外部程序,比如Ant,但没有放入 CALL 在蚂蚁面前。所以,确保你 呼叫 批处理脚本中使用的每个外部程序。

        3
  •  11
  •   Masoud Kermani    16 年前

    根本原因是DOS命令行处理器(shell程序)将UNIX行尾字符作为标签的一部分。由于go-to零件从未将其用作标签,因此从未找到,因为此类标签确实不存在。解决方案是在每个目标标签的末尾添加一个额外的空格,甚至更好地在每一行中添加空格。现在,UNIX的行尾不再起作用,因为空格充当分隔符,并且一切正常。

        4
  •  11
  •   naXa stands with Ukraine    8 年前

    只是 unix2dos 这是一个需要解决的问题。

        5
  •  5
  •   Lukasz Lukasz    17 年前

    您还应该确保在调用其他脚本时使用CALL,而不是在调用方的环境中调用它们。

        6
  •  3
  •   Greg    12 年前

    解决方案是将所有行尾更改为CR+LF DOS样式。 这个问题令人困惑,因为批处理文件基本上是有效的,重新排列行改变了效果。

    call:function_A "..\..\folderA\"
    call:function_B "..\..\folderB\"
    call:function_C "..\..\folderC\"
    call:function_D "..\..\folderD\"
    goto:eof
    
    :function_A
    rem do stuff
    goto:eof
    
    ...etc...
    

    函数C将导致错误“系统找不到指定的批次标签”。奇怪的是,它可以通过重新安排通话而消失。

    也许VonC的意思是“批处理文件必须使用CRLF行结尾”。

        7
  •  3
  •   jeb    6 年前

    有多种可能的方法获取错误。

    1. Described by VonC -错误的行尾,左前而非CR/LF

    2. Obscure long lines (如果这是偶然发生的,那么您的代码就糟糕得难以置信了)

    3. 调用函数后直接启动另一批。

      @echo off
      call :func
      echo back from second
      exit /b
      :func second.bat echo NEVER COME BACK HERE
      goto 贴标签 :func
      但这是可能的 (管理信息系统) -用于直接调用其他批处理文件中的标签

    the answer of Marshal

        8
  •  2
  •   Stefan Michev    13 年前

    在从word复制开始命令并将其粘贴到命令窗口后,我遇到了这个问题。前面有一个带“-”的选项,并且认为它看起来和DOS一样“-”不是:)在我自己键入“-”后,问题解决了,批处理工作正常。。。一个很难找到的问题。。。。

        9
  •  0
  •   Prasanna Mondkar    7 年前

    有点不同的用例。。。

    我当时正在调用一个bat脚本 包装工 使用 供应器(OpenSSH)。

    最初,我只是开始通过扩展调用本身和内联子例程代码来完全删除子例程。我对只有一个调用(没有代码重复)的所有实例都这样做。

    但是,是的,我确实偶然发现了一艘来自3,4个地方的潜艇。在尝试了一切之后,这对我来说是有效的

    PS:脚本非常古老,但管理层需要我通过packer来完成(我们有一个第二天的计划,用Ansible/Chef来代替它)。

    推荐文章