Windows-为什么即使标签存在,也会引发“系统找不到指定的批次标签”?

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

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

当然标签存在。 是什么导致此错误?

Slimak asked 2019-11-08T15:34:19Z
8个解决方案
60 votes

实际上,您需要满足以下两个条件:

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

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

David A.Gray在评论中提到(在Windows 10上看到)Marshal在2014年(答案可能是在Windows 7或8)上显示的答案:执行不带CALL472的脚本/批处理程序(CALL.cmd473)将触发eol转换。

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

VonC answered 2019-11-08T15:35:15Z
35 votes

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

Marshal answered 2019-11-08T15:35:41Z
11 votes

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

根本原因是DOS命令行处理器(shell程序)将UNIX行尾字符作为标签的一部分。 由于转到零件永远不会将其用作标签,因此永远不会找到它,因为这样的标签确实不存在。 解决方案是在每个目标标签的末尾,甚至在每一行的末尾都留一个多余的空间。 现在,UNIX的行尾不再起作用,因为空格充当分隔符,并且一切正常。

Masoud Kermani answered 2019-11-08T15:36:21Z
9 votes

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

只是unix2dos它,问题应该解决。

Slimak answered 2019-11-08T15:36:55Z
5 votes

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

answered 2019-11-08T15:37:23Z
3 votes

我刚才在使用.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行结尾”。

Greg answered 2019-11-08T15:38:14Z
2 votes

从Word复制启动命令并将其粘贴到命令窗口后,出现了这个问题。 前面有一个选项“-”,并认为外观与DOS的“-”相同:): 找到问题....

Stefan Michev answered 2019-11-08T15:38:40Z
0 votes

几乎没有什么不同的用例...

我在Windows Server 2012 Server的打包程序构建过程中使用外壳配置程序(OpenSSH)调用了bat脚本。现在,该脚本在已配置的虚拟机中通过cmd运行良好(将打包程序构建中的断点置于停止状态并确认了此操作)...但是,由于未找到这些调用标签而导致失败。

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

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

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

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

PS:脚本非常旧,但是管理层需要我通过打包程序来完成该工作(我们有一个Day-2计划,要用Ansible / Chef替换它)。

Prasanna Mondkar answered 2019-11-08T15:40:02Z
translate from https://stackoverflow.com:/questions/232651/why-the-system-cannot-find-the-batch-label-specified-is-thrown-even-if-label-e