Why "The system cannot find the batch label specified" is thrown even if label exists?

Viewed 77686

While running a batch file in Windows XP I have found randomly occurring error message:

The system cannot find the batch label specified name_of_label

Of course label existed. What causes this error?

10 Answers

Actually, you need 2 conditions for this to happen:

  • the batch file must not use CRLF line endings
  • the label you jump to must span a block boundary (as opposed to and :end label wich is just a shortcut to the end of your script)

See. The system cannot find the batch label specified (by and Batch-as-batch-can!

David A. Gray mentions in the comments seeing (on Windows 10) what Marshal's answer showed in 2014 (presumably on Windows 7 or 8): a script/batch program (.bat or .cmd) executed without CALL would trigger an eol conversion.

I've written hundreds of batch scripts over the last 35 years, and the only time I've ever had an issue with labels not being found was when the file's line breaks got converted from Windows (CR/LF), which works, to Unix (LF), which doesn't.


Feb. 2020, kinar adds in the comments:

Just encountered this issue on a Win7 machine.
Turns out this error can also be generated when trying to CALL another .bat file if that file doesn't exist on the system.
In my case, I was trying to call the Visual Studio vcvarsall.bat file on a system without VS installed.

See jeb's answer for more: it was a case of an undefined label.


Note: in a Git repository, I would recommend a .gitattributes file with the directive:

*.bat   text eol=crlf

If batch file has unix line endings (line separators) this can sometimes happen.

Just unix2dos it and problem should be solved.

You should also make sure that when calling other scripts you use CALL, instead of calling them in the caller's environment.

There are multiple possible ways to get the error.

  1. Described by VonC - Wrong line endings, LF instead of CR/LF

  2. Obscure long lines (if that happens accidential, your code is incredible worse)

  3. Direct start another batch after calling a function.
    Sample:

    @echo off
    call :func
    echo back from second
    exit /b
    :func second.bat echo NEVER COME BACK HERE
    This unexpectedly tries to goto to the label :func in second.bat.
    But this can be (mis)-used to directly call labels in another batch file

This is the described behaviour of the answer of Marshal

Little different use case ...

I was calling a bat script during packer build of Windows Server 2012 Server, using the shell provisioner (OpenSSH). Now, the script was working fine through cmd in the provisioned Virtual Machine (put breakpoint in packer build to stop and confirmed this) ... but, it was failing with these call labels not found issues.

The Line Endings were fine, CRLF (confirmed in Notepadd++). The script was working fine through command line as well. What more, sometimes, it just use to run fine and sometime fail, but once failed for some label, the failure was consistent.

Initially, I just started removing the subroutines altogether by expanding the call itself and putting subroutine code inline. I did this for all instances where there was only one call (no code duplication).

But, yeah, i did stumble upon one sub which was called from 3,4 places. After trying everything, this is what worked for me

Adding 8-10 REM statements just above the subroutine. Yes, I am not kidding !!

PS : The script is very very old, but management needed me to make that work through packer (we have a Day-2 plan of this to replace it with Ansible/Chef).

I had the error :

The system cannot find the batch label specified -

and I found that on a line I used

goto : eof

instead

goto :eof

So check for the same issue of using labels, if the solutions from above didn't worked out.

Related