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

时间:2008-10-24 06:34:01

标签: windows batch-file label

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

  

系统找不到指定的名称name_of_label

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

11 个答案:

答案 0 :(得分:54)

实际上,您需要有两个条件:

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

请参阅。 The system cannot find the batch label specifiedBatch-as-batch-can!

答案 1 :(得分:31)

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

答案 2 :(得分:11)

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

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

答案 3 :(得分:9)

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

只需unix2dos就可以解决问题。

答案 4 :(得分:5)

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

答案 5 :(得分: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行结尾”。

答案 6 :(得分:3)

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

  1. Described by VonC-错误的行尾,用LF代替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
    这意外地试图将second.bat中的goto标记为:func
    但这可以(mis)-用于直接调用另一个批处理文件中的标签

这是the answer of Marshal

的描述行为

答案 7 :(得分:2)

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

答案 8 :(得分:0)

几乎没有用例...

我在Windows Server 2012 Server的 packer 构建过程中使用 shell 预配程序(OpenSSH)调用了bat脚本。 现在,该脚本通过已配置的虚拟机中的cmd正常运行(将打包程序构建中的断点置于停止状态并确认了此操作)...但是,由于这些调用标签未发现问题,该脚本失败了。

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

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

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

  

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

PS:该脚本非常旧,但是管理层需要我通过打包程序来完成该工作(我们有第2天的计划,将其替换为Ansible / Chef)。

答案 9 :(得分:-1)

发生了我的错误输入“ goto : label” 解决方案是简单地删除定界符':'与标签名称"goto :label"

之间的空格

答案 10 :(得分:-2)

:punc中的

如果它正在调用dos命令以外的程序,请尝试使用“ call ..” 而不是“ ...”。