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

Sli*_*mak 57 windows label batch-file

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

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

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

Von*_*onC 62

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

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

看到.系统找不到指定的批次标签Batch-as-batch-can!

  • 这可能是微软的另一个恶心的笑话……我花了很长时间才弄明白这一点……当然,Notepad++ 并不关心行尾,除非你去告诉它转换为另一个……我的只设置为 LF。 。 谢谢。 (3认同)
  • 有这个问题的蚂蚁批处理文件随eclipse一起提供并从MSVC调用 - 更改行结尾都是固定的,谢谢你. (2认同)
  • @MarkDeven - 在 DosTips 中,即使使用 CRLF 行,我也[演示了如何错过有效的`:label`](https://www.dostips.com/forum/viewtopic.php?f=3&t=8988#p58890)结局,但我怀疑这就是你问题的根源。稍后在同一个 DosTips 线程中,我列出了 [我目前了解的如何批量扫描标签的规则](https://www.dostips.com/forum/viewtopic.php?f=3&t=8988&start=15#p58925 )。我同意 VonC 的观点,即您可能想提出一个单独的 SO 问题,或者您可以考虑将您的问题贡献给 DosTips 讨论。 (2认同)
  • @Luke 好点(令人印象深刻的是这个答案在 13 年后仍然有意义)。这就是为什么我的 Git 存储库中总是有一个带有指令“*.bat text eol=crlf”的“.gitattributes”文件。 (2认同)

Mar*_*hal 35

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

  • 在Windows中,您可能正在运行`.bat`并且没有意识到它!我刚刚了解到运行`mvn`实际上执行了一个批处理文件`mvn.cmd`,并且在我运行`mvn`的任何时候试图理解为什么我的脚本在出现此错误时失败了一个小时. (3认同)
  • 严格来说,@Nathan 所说的从脚本调用外部程序仅适用于其他批处理脚本(.BAT 和 .CMD 文件)。我还没有尝试过调用可执行程序(.EXE 文件),但我怀疑调用是无害的。对于 EXE 文件,还有 START,当相关程序创建新进程时(例如,当相关程序是图形 Windows 程序时),该命令很有用。 (3认同)

小智 11

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

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

  • 不,“\n”不被视为标签的一部分,并且在标签后添加空格没有帮助。问题确实如 [VonC 报道](/sf/answers/16287211/) 所示,正如我在 https://www.dostips.com/forum/viewtopic.php?f=3&t= 中演示的那样8988#p58888 (2认同)

Sli*_*mak 9

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

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


小智 5

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