【问题标题】:Windows batch file - The system cannot find the batch label specifiedWindows 批处理文件 - 系统找不到指定的批处理标签
【发布时间】:2009-10-05 20:11:47
【问题描述】:

问题

我在使用 Windows 批处理文件和标签时遇到问题。 我不断收到此错误:

系统找不到批次标签 指定

我尝试过的

  • 两台电脑;一台 WindowsXP 和一台 2003 服务器。
  • 确保它被编码为 ASCII
  • 编辑了行继续字符的十六进制代码。尝试依次用 CR 、 LF 和 CRLF 替换所有内容。所有组合都会给我同样的错误。
  • 尝试在标签前插入额外字符以使标签超过 512 个字符。

代码如下:

cls
@echo off
SET zip=7za a dependencies.7z
call:dozip "c:\temp\dir.txt"

pause
goto exit

:dozip
  echo Testing 1.2.3...
  %zip% %1
goto:eof
:exit

这是带有 CRLF (0d 0a) 的十六进制。

63 6c 73 0d 0a 53 45 54 20 7a 69 70 3d 37 7a 61 20 61 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 37 7a 0d 0a 63 61 6c 6c 3a 64 6f 7a 69 70 20 22 63 3a 5c 74 65 6d 70 5c 64 69 72 2e 74 78 74 22 0d 0a 0d 0a 70 61 75 73 65 0d 0a 67 6f 74 6f 20 65 78 69 74 0d 0a 0d 0a 3a 64 6f 7a 69 70 0d 0a 20 20 65 63 68 6f 20 54 65 73 74 69 6e 67 20 31 2e 32 2e 33 2e 2e 2e 0d 0a 20 20 25 7a 69 70 25 20 25 31 0d 0a 67 6f 74 6f 3a 65 6f 66 0d 0a 3a 65 78 69 74

这是控制台的输出(当我删除 @echo off 时):

C:\>SET zip=7za a dependencies.7z

C:\>call:dozip "c:\temp\dir.txt"

C:\>echo Testing 1.2.3...
Testing 1.2.3...

C:\>7za a dependencies.7z "c:\temp\dir.txt"
The system cannot find the batch label specified - dozip

C:\>pause
Press any key to continue . . .

它实际上从未创建 7zip 文件,所以我想我可以假设它在这条线上崩溃了;

7za a dependencies.7z "c:\temp\dir.txt"

如果我从命令提示符单独运行该行,它可以正常工作并创建 dependencies.7z,所以我认为 7za.exe 不一定有问题。

我已经阅读过这个 stackoverflow 问题: stackoverflow.com/questions/232651/why-the-system-cannot-find-the-batch-label-specified-is-throw-even-if-label-ex

以及该帖子的链接; help.wugnet.com/windows/system-find-batch-label-ftopict615555.html

答案

所以,我找到了问题。

我使用了一种我常用的技术,我只能将其描述为“代理”批处理文件。我有一个名为 c:\scripts 的文件夹,我在其中放了几个 bat 文件来定位常用的 exe。这可以避免我的 PATH 变量在我所有的命令行工具中变得绝对庞大。这样我只需将 c:\scripts 添加到我的 PATH 中,并在需要时创建一个代理批处理文件。

我在 c:\scripts 中有 7za.bat,只包含这个;

@echo off
"C:\Program Files\7-zip\7za.exe" %*

我把我的脚本改成了这个;

SET zip="c:\program files\7-zip\7za.exe" a dependencies.7z

而不是这个;

SET zip=7za a dependencies.7z

它完美地工作。

故事的寓意...

避免从批处理文件中调用其他批处理文件。如果这样做,您需要在它们前面加上“call”。

【问题讨论】:

  • 在 Server 2003 上运行良好。使用 notepad.exe 输入,使用 ANSI 编码保存,然后从 cmd.exe 运行。
  • 在我的 XP 机器上也能正常使用记事本和 ANSI 编码
  • 可能无关紧要,但是这个批处理文件的名称是什么?
  • 原来叫7z.bat,我试过test.bat,7z111.bat...同样的错误
  • 是的,可以。在我的批处理文件中,我总是输入完整的文件名,例如7za.execall helper.bat。 (注意这样,任何以.bat 结尾的东西都会很明显。)

标签: windows batch-file cmd label goto


【解决方案1】:

我会指出“正在测试 1.2.3...”和“按任意键继续...”行表示执行已成功转到 :dozip 标签,然后成功返回给调用者。

“7za”可执行文件实际上是一个批处理文件吗?如果我修改我的测试脚本以使助手成为批处理文件,我会得到同样的错误。解决方法是执行 'call %zip% %1'

【讨论】:

  • 我将在不关闭@echo 的情况下添加完整输出。这可能会对情况有所启​​发。
  • 你的 %path% 中有 7za.bat 吗?无论如何,尝试将“%zip% %1”行更改为“call %zip% %1”。
  • 谢谢安德鲁,是的,7za.bat 在我的路径中,问题是我根本使用的是 7za.bat。请参阅我帖子中的“答案”部分。
【解决方案2】:

故事的寓意:在批处理文件中调用外部程序/批处理文件时,使用 call

call foo.bat

和/或

call %foo%

(从DOS时代就开始一批一批的调用了,记得调用)

【讨论】:

    【解决方案3】:

    一种可能性(虽然看起来不太可能)是命令扩展未启用或未更新,这会干扰 call/goto/label 行为。

    试试:

    echo [%cmdextversion%]
    

    如果它小于[2](或为空 -- [])然后检查cmd.exe 是否被/e:off 调用,或者直接运行

    cmd /e:on
    

    在您将运行此批处理文件的控制台窗口中。

    【讨论】:

    • echo [%cmdextversion%] 返回 [2]
    【解决方案4】:

    “系统找不到指定的批次标签”错误消息将我带到这里(10 年后!),问题原来是 CRLF 不正确。

    在我们的例子中,原因是 Git 存储库没有将 BAT 文件识别为在 Windows 7 机器上需要为 CRLF 的文本文件。

    我们的解决方案是创建一个包含以下行的 .gitattributes 文件:

    *.bat text eol=crlf
    

    然后删除 BAT 文件并从存储库中签出以正确的行结尾重新编写了我们的 BAT 文件。 BAT 标签现在再次起作用。

    【讨论】:

    • +1 就是这样。确保在提交 .gitattribute 文件后删除任何远程副本,以便再次签出 repo。
    【解决方案5】:

    在我的情况下,“系统找不到指定的批次标签”的原因是:

    1. 在 jar-和 unzip-commands 之前没有 CALL
    2. 每个 SETLOCAL DisableDelayedExpansion 都没有 ENDLOCAL
    3. 其他一些批处理魔术,我在 SETLOCAL DisableDelayedExpansion 附近没有完全理解,重要的是在 SETLOCAL DisableDelayedExpansion 或类似的东西之后放置 SET param=1

    【讨论】:

      【解决方案6】:

      你在使用Windows NT 4/Windows 2000吗?只有在那里你才能使用 CALL 来调用同一个批处理文件中的子程序。

      【讨论】:

        【解决方案7】:

        仔细查看您的十六进制,它实际上并不包含所有 CRLF (0d 0a)。几行仅以 LF 结尾(0a 前面没有 0d)。

        检查您的十六进制编辑器,确保每个 0a 前面都有0d(正好是一个)。

        或者只是将文件剪切并粘贴到空白记事本文档中,然后重新保存。

        【讨论】:

        • 谢谢!我会试试的。也许我上次做十六进制查找/替换时错过了一个。我是靠眼球做的,所以也许我错过了什么。
        • 我重做了,两次和三次检查我的 CRLF。还是不行。 63 6C 73 0D 0A 53 45 54 20 7A 69 70 3D 37 7A 61 20 61 20 61 20 64 65 70 65 65 6E 64 64 64 65 6E 63 69 69 69 65 73 2E 37 7A 0A 0A 0A 0A 63 61 61 61 6C 6C 3A 6C 3A 64 6F 7A 69 7A 69 7A 69 70 20 20 63 63 3A 3A图5c 74 65 6D 70 5C 64 69 72 2E 74 78 74 22 0D 0A 0D 0A 70 61 75 73 65 0D 0A 67 6F 74 6F 20 65 78 69 74 0D 0A 0D 0A 3A 64 6F 7A 69 70 0D 0A 20 20 65 63 68 6f 20 54 65 73 74 69 6e 67 20 31 2e 32 2e 33 2e 2e 2e 0d 0a 20 20 25 7a 69 70 25 20 25 31 0d 0a 67 6f 74 6f 3a 65 74 6f 656 786跨度>
        猜你喜欢
        • 1970-01-01
        • 2020-08-21
        • 1970-01-01
        • 2015-03-08
        • 1970-01-01
        • 2013-11-19
        • 2017-03-25
        • 2012-12-13
        • 1970-01-01
        相关资源
        最近更新 更多