Windows 为什么;系统找不到指定的批次标签";即使标签存在也会抛出?
在Windows XP中运行批处理文件时,我发现随机出现的错误消息: 系统找不到批标签指定的名称\u或\u标签Windows 为什么;系统找不到指定的批次标签";即使标签存在也会抛出?,windows,batch-file,label,Windows,Batch File,Label,在Windows XP中运行批处理文件时,我发现随机出现的错误消息: 系统找不到批标签指定的名称\u或\u标签 当然,这个标签是存在的。导致此错误的原因是什么?如果批处理文件具有unix行结尾(行分隔符),则有时会发生这种情况 只有这样,问题才能得到解决。实际上,发生这种情况需要两个条件: 批处理文件不得使用CRLF行结尾 跳转到的标签必须跨越块边界(与and:end label相反,and:end label只是指向脚本末尾的快捷方式) 看。(由及 提到看到(在Windows 10上)20
当然,这个标签是存在的。导致此错误的原因是什么?如果批处理文件具有unix行结尾(行分隔符),则有时会发生这种情况
只有这样,问题才能得到解决。实际上,发生这种情况需要两个条件:
- 批处理文件不得使用CRLF行结尾
- 跳转到的标签必须跨越块边界(与and:end label相反,and:end label只是指向脚本末尾的快捷方式)
.bat
或.cmd
)将触发eol转换
在过去的35年中,我已经编写了数百个批处理脚本,我唯一一次遇到标签找不到的问题是文件的换行符从Windows(CR/LF)转换到Unix(LF),后者不工作
2020年2月,新增: 刚刚在Win7计算机上遇到此问题。
如果系统上不存在另一个
.bat
文件,则尝试调用该文件时也会产生此错误。在我的例子中,我试图在未安装VS的系统上调用Visual Studio
vcvarsall.bat
文件
有关更多信息,请参阅:这是一个未定义标签的情况。您还应该确保在调用其他脚本时使用CALL,而不是在调用方的环境中调用它们。以下是问题以及如何解决问题。问题是DOS批处理cmd程序中的错误或功能。首先请清除问题陈述。如果您有DOS批处理目标标签为“:dothis”的文件,并且标签末尾没有空间,如果行结尾是UNIX行结尾,则批处理文件将无法工作。这意味着您必须在文件上运行unix2dos,然后才能使用它
根本原因是DOS命令行处理器(外壳程序),将UNIX行尾字符作为标签的一部分。由于“转到”部分从不使用此字符作为标签,因此找不到它,因为这样的标签确实不存在。解决方案是在每个目标标签的末尾添加一个额外的空格,甚至更好的是在每行末尾添加一个空格。现在,UNIX行尾字符不起作用,因为空格充当分隔符这一切都是可行的。我以前也遇到过同样的问题。但是,根本原因不是CRLF。这是因为在脚本中我执行了一个外部程序,如Ant,但没有在Ant之前调用
。因此,请确保批处理脚本中使用的每个外部程序都是调用的。我在复制了一个批处理脚本之后遇到了这个问题从word启动命令并将其粘贴到命令窗口。前面有一个带“-”的选项,并且认为它看起来与DOS相同“-”不是:)在我自己键入“-”后,问题得到解决,批处理工作正常。。。一个很难找到的问题 我刚才在.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行结尾”。用例有点不同
在构建WindowsServer2012服务器的过程中,我使用ShellProvisioner(OpenSSH)调用了一个bat脚本。
现在,脚本通过配置的虚拟机中的cmd正常工作(将断点放在packer build中以停止并确认这一点)。。。但是,它失败了,因为这些呼叫标签没有找到问题
行结尾很好,CRLF(在Notepadd++中确认)。脚本在命令行中也运行良好。而且,有时,它只是用来运行良好,有时失败,但一旦失败的一些标签,失败是一致的
最初,我只是开始通过扩展调用本身和内联子例程代码来完全删除子例程。我对只有一个调用(没有代码重复)的所有实例都这样做
但是,是的,我确实偶然发现了一艘来自3,4个地方的潜艇。在尝试了一切之后,这对我来说是有效的
在子程序上方添加8-10条REM语句。是的,我不是在开玩笑
PS:脚本非常古老,但管理层需要我通过packer来实现这一点(我们有一个第二天的计划,用Ansible/Chef替换它)。有多种可能的方法来获得错误
-错误的线端,左前而非CR/LF
(如果这是偶然发生的,那么您的代码就糟糕得难以置信了)
调用函数后直接启动另一批。
示例:@echo-off
电话:func
第二声回音
退出/b
:func
第二,蝙蝠
echo再也不回来了
这会意外地尝试在second.bat中转到标签:func
。
但这可以(mis)用于直接调用另一个批处理文件中的标签
这是所描述的行为在eclipse附带的ant批处理文件中出现了这个问题,并且被MSVC调用-更改行尾都已修复,谢谢。这可能是微软的另一个病态笑话。。。我花了很长时间才弄明白。。当然,记事本++不关心行尾,除非你去告诉它转换为其他。。。我的设置为仅左前。。谢谢。@MarkDeven-我甚至在使用CRLF行结尾时也有过这样的提示,但我对此表示怀疑
@echo off
call :func
echo back from second
exit /b
:func
second.bat
echo NEVER COME BACK HERE