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

8

问题

我在使用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 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"

如果我从命令提示符中单独运行该行,它可以正常工作并创建依赖项。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文件,以针对常用的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 运行。 - nobody
在我的XP电脑上,使用记事本和ANSI编码也可以正常运行。 - AdamW
可能与编程无关,但这个批处理文件的名称是什么? - system PAUSE
它最初被称为7z.bat,我尝试过test.bat、7z111.bat等,但是出现了相同的错误。 - csauve
没错,这样做就可以了。在我的批处理文件中,我总是使用完整的文件名,例如 7za.execall helper.bat。(请注意,这样一来,任何以 .bat 结尾的文件都会很明显。) - system PAUSE
我也最近在Windows 10中遇到了这个错误。我想知道是否有一个更新破坏了命令(shell)。至于“故事的寓意”评论- CALL和GOTO具有非常不同的语义,因此请使用与您的应用程序匹配的其中一个。 - will
7个回答

7
我想指出,“Testing 1.2.3…”和“Press any key to continue . . .”这两行表明程序已经成功跳转到:dozip标签并成功返回给调用者。
“7za”可执行文件实际上是批处理文件吗?如果我修改我的测试脚本,将助手变成批处理文件,我会得到相同的错误。解决方法是执行'call %zip% %1'。

我将添加完整的输出,而不是@echo off。这可能会为情况带来一些启示。 - csauve
你的%path%中有一个7za.bat吗?无论如何,尝试将"%zip% %1"这一行改为"call %zip% %1"。 - nobody
谢谢Andrew,是的,7za.bat在我的路径中,问题在于我根本不应该使用7za.bat。请查看我帖子中的“答案”部分。 - csauve

3
故事的寓意是:在批处理文件中调用外部程序/批处理文件时,请使用call命令。
call foo.bat

和/或

call %foo%

自从DOS时代以来,调用一个批处理文件中的另一个批处理文件就一直存在。只需记住要调用即可。


2

“系统找不到指定的批处理标签”错误信息把我带到这里(10年后!),问题最终发现是CRLF不正确。

在我们的情况下,原因是Git存储库未将BAT文件识别为需要在Windows 7机器上使用CRLF的文本文件。

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

Original Answer翻译成:最初的回答

*.bat text eol=crlf

然后删除BAT文件并从代码库重新检出,将重新编写具有正确行结尾的BAT文件。现在,BAT标签再次有效。


+1,就是这样。确保在提交.gitattribute文件后删除任何远程副本,以便再次检出存储库。 - Johannes

1

有一种可能性,尽管看起来不太可能,那就是命令扩展没有启用或更新,这可能会干扰调用/转到/标签的行为。

尝试:

echo [%cmdextversion%]

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

cmd /e:on

在你运行这个批处理文件的控制台窗口中。


回显 [%cmdextversion%] 返回 [2]。 - csauve

1
在我的情况下,“系统找不到指定的批处理标签”的原因如下:
  1. 在jar和unzip命令之前没有CALL
  2. 每个SETLOCAL DisableDelayedExpansion都没有ENDLOCAL
  3. 还有一些其他的批处理技巧,在SETLOCAL DisableDelayedExpansion附近,我没有完全理解,重要的是在SETLOCAL DisableDelayedExpansion之后放置SET param=1或类似的内容

0

你正在使用Windows NT 4/Windows 2000吗?只有在这里,您才能使用CALL指令调用同一批处理文件内的子程序。


0

仔细查看您的十六进制代码,实际上并不是所有的行都以CRLF(0d 0a)结尾。有几行只以LF(0a)结尾,没有前导的0d

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

或者,只需将文件复制并粘贴到空白的记事本文档中,然后重新保存即可。


谢谢!我会尝试一下。也许上次进行十六进制查找/替换时我漏掉了一个。我是靠肉眼来做的,所以可能错过了什么。 - csauve
我重新做了一遍,仔细检查了我的CRLF。还是不行。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 - csauve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接