8

问题

我遇到了 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 ”。

4

7 回答 7

7

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

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

于 2009-10-05T20:28:29.887 回答
3

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

call foo.bat

和/或

call %foo%

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

于 2009-10-06T02:10:46.850 回答
1

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

尝试:

echo [%cmdextversion%]

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

cmd /e:on

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

于 2009-10-05T20:45:38.323 回答
1

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

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

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

*.bat text eol=crlf

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

于 2019-05-24T15:44:07.750 回答
1

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

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

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

于 2009-10-05T20:17:53.807 回答
0

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

检查您的十六进制编辑器以确保每个 0a都以0d(正好一个)开头。

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

于 2009-10-05T20:29:03.207 回答