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

windows batch-file label

53041 观看

8回复

518 作者的声誉

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

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

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

作者: Slimak 的来源 发布者: 2008 年 10 月 24 日

回应 (8)


9

518 作者的声誉

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

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

作者: Slimak 发布者: 24.10.2008 06:37

56

884619 作者的声誉

决定

实际上,您需要2个条件才能实现:

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

看到。系统找不到指定的批处理标签(通过批处理批处理可以!

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

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

作者: VonC 发布者: 24.10.2008 06:49

5

0 作者的声誉

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

作者: Lukasz 发布者: 05.12.2008 09:30

11

111 作者的声誉

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

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

作者: Masoud Kermani 发布者: 19.08.2010 07:53

33

2589 作者的声誉

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

作者: Marshal 发布者: 21.06.2011 12:26

2

2883 作者的声誉

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

作者: Stefan Michev 发布者: 14.01.2013 10:36

3

703 作者的声誉

我刚刚遇到类似的问题.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 发布者: 13.12.2013 02:32

0

91 作者的声誉

一点点用例......

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

Line Endings很好,CRLF(在Notepadd ++中确认)。该脚本也通过命令行正常工作。更何况,有时,它只是用来运行良好,有时失败,但一旦标签失败,失败是一致的。

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

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

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

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

作者: Prasanna Mondkar 发布者: 16.08.2019 03:16
32x32