77

在 Windows XP 中运行批处理文件时,我发现随机出现的错误消息:

系统找不到指定name_of_label的批次标签

当然标签是存在的。是什么导致了这个错误?

4

9 回答 9

89

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

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

看。系统找不到指定的批次标签(by and Batch-as-batch-can!

David A. Gray在评论中提到(在 Windows 10 上)Marshal回答在 2014 年(大概在 Windows 7 或 8 上)显示的内容:脚本/批处理程序(.bat.cmd)在没有执行的情况下CALL会触发 eol 转换。

在过去的 35 年中,我编写了数百个批处理脚本,而我唯一一次遇到找不到标签的问题是文件的换行符从有效的 Windows (CR/LF) 转换为Unix(LF),它没有。


2020 年 2 月,kinar在评论中补充道:

刚在win7机器上遇到这个问题。事实证明,如果系统上不存在该文件,则
在尝试调用另一个文件时也会产生此错误。 就我而言,我试图在未安装 VS 的系统上调用 Visual Studio 文件。.bat
vcvarsall.bat

有关更多信息,请参见jeb答案:这是未定义标签的情况。


注意:在 Git 存储库中,我会推荐一个.gitattributes带有指令的文件:

*.bat   text eol=crlf
于 2008-10-24T06:49:52.940 回答
49

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

于 2011-06-21T00:26:10.703 回答
12

如果批处理文件具有 unix 行结尾(行分隔符),则有时会发生这种情况。

只需unix2dos 即可解决问题。

于 2008-10-24T06:37:22.497 回答
11

这是问题以及如何解决它。问题是 DOS 批处理 cmd 程序中的错误或功能。首先是明确的问题陈述。如果您有一个带有目标标签的 DOS 批处理文件,例如“:dothis”,并且在标签的末尾没有空间,那么如果行结尾是 UNIX 行结尾,则批处理文件将无法工作。这意味着您必须在文件上运行 unix2dos 才能使用它。

根本原因是 DOS 命令行处理器(shell 程序)将 UNIX 行尾字符作为标签的一部分。由于 go to 部分从不使用 this 作为标签,因此永远找不到它,因为这样的标签确实不存在。解决方案是在每个目标标签的末尾放置一个额外的空格,或者更好的是每一行。现在 UNIX 行尾不再起作用,因为空格充当分隔符并且一切正常。

于 2010-08-19T19:53:47.260 回答
5

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

于 2008-12-05T21:30:04.783 回答
3

我刚才在 .cmd 文件和 Windows 8 中遇到了类似的问题。解决方案是将所有行尾更改为 CR+LF DOS 样式。这个问题令人困惑,因为批处理文件主要工作并且重新排列行改变了效果。

.cmd 文件如下所示:

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 会导致错误“系统找不到指定的批次标签”。奇怪的是,它可以通过重新安排呼叫而消失。将行尾从 0x0A 更改为 0x0D0A 似乎已经修复了它。

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

于 2013-12-13T02:32:53.880 回答
3

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

  1. 由 VonC 描述- 错误的行尾,LF 而不是 CR/LF

  2. 晦涩的长行(如果这是偶然发生的,你的代码会更糟)

  3. 调用函数后直接启动另一个批处理。
    样本:

    @echo off
    call :func
    echo back from second
    exit /b
    :func second.bat echo NEVER COME BACK HERE
    这出乎意料地尝试到second.batgoto中的标签:func
    但这可以(错误)用于直接调用另一个批处理文件中的标签

这是元帅回答 的描述行为

于 2020-02-17T15:03:42.610 回答
2

从word复制启动命令并将其粘贴到命令窗口后,我遇到了这个问题。前面有一个带有“-”的选项,并认为看起来与DOS“-”相同:)我自己输入“-”后,问题得到解决,批处理工作......很难发现问题....

于 2013-01-14T10:36:01.480 回答
0

小不同的用例...

在 Windows Server 2012 Server 的打包程序构建期间,我使用shell配置程序 (OpenSSH)调用了一个 bat 脚本。现在,脚本在配置的虚拟机中通过 cmd 运行良好(在打包程序构建中放置断点以停止并确认这一点)......但是,由于这些调用标签未找到问题,它失败了。

行尾很好,CRLF(在 Notepadd++ 中确认)。该脚本也可以通过命令行正常工作。更重要的是,有时它只是用来运行良好,有时会失败,但是一旦某个标签失败,失败是一致的。

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

但是,是的,我确实偶然发现了一个从 3,4 个地方调用的子。在尝试了一切之后,这对我有用

在子例程上方添加 8-10 条 REM 语句。是的,我不是在开玩笑!

PS:脚本非常古老,但管理层需要我通过打包程序完成这项工作(我们有一个第二天的计划,用 Ansible/Chef 替换它)。

于 2019-08-16T15:16:07.737 回答