Windows批处理文件 - 系统找不到指定的批处理标签

时间:2009-10-05 20:11:47

标签: windows batch-file cmd label goto

问题

我遇到了Windows批处理文件和标签的问题。 我一直收到这个错误:

  

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

我尝试了什么

  • 两台电脑; WindowsXP和2003 Server。
  • 确保它被编码为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时):

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"

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

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

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

答案

所以,我找到了问题的人。

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

我在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

它完美无缺。

故事的寓意......

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

7 个答案:

答案 0 :(得分:5)

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

“7za”可执行文件实际上是批处理文件吗?如果我修改我的测试脚本让帮助程序成为批处理文件,我会得到同样的错误。解决方法是“调用%zip %% 1”

答案 1 :(得分:3)

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

call foo.bat

和/或

call %foo%

(自DOS开始以来,已经完成了另一个批处理,只记得打电话)

答案 2 :(得分:1)

虽然看起来不太可能,但有一种可能性是命令扩展未启用或更新,这会干扰调用/转到/标签行为。

尝试:

echo [%cmdextversion%]

如果它小于[2](或为空 - []),请检查cmd.exe是否正在调用/e:off,或者只是运行

cmd /e:on

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

答案 3 :(得分:1)

就我而言,“系统找不到指定的批次标签”的原因是:

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

答案 4 :(得分:0)

您使用的是Windows NT 4/Windows 2000吗?只有你可以使用CALL来调用同一个批处理文件中的子程序。

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

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

在我们的案例中,原因是一个Git存储库,该存储库无法将BAT文件识别为文本文件,而在Windows 7计算机上,该文件必须为CRLF。

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

*.bat text eol=crlf

然后删除BAT文件并从存储库中检出,以正确的行尾重新编写了我们的BAT文件。 BAT标签现在又可以正常工作了。