The Problem
I'm having a problem with a Windows batch file and labels. I keep getting this error:
The system cannot find the batch label specified
What I've tried
- Two computers; a WindowsXP and a 2003 Server.
- Made sure it was encoded as ASCII
- Editted the hex code for the line continuation characters. Tried replacing all with CR , LF, and CRLF in turn. All combinations give me the same error.
- Tried inserting extra characters before the label to make the label past 512 characters.
Here is the code:
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
Here's the hex with 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
Here's the console's output (when I remove @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 . . .
It never actually creates the 7zip file, so I think I can assume that its crashing on this line;
7za a dependencies.7z "c:\temp\dir.txt"
If I run that line by itself from a command prompt, it works fine and creates the dependencies.7z, so I don't think its necessarily a problem with 7za.exe.
I've already read this stackoverflow question: stackoverflow.com/questions/232651/why-the-system-cannot-find-the-batch-label-specified-is-thrown-even-if-label-ex
and the link from that post; help.wugnet.com/windows/system-find-batch-label-ftopict615555.html
The Answer
So, I found the problem guys.
I was using a technique I commonly use that I could only really describe as "proxy" batch files. I have a folder called c:\scripts, and I put several bat files in there to target commonly used exes. This saves my PATH variable from becoming absolutely massive with all of my command line tools. This way I only need to add c:\scripts to my PATH, and create a proxy batch file when I need something.
I had 7za.bat in c:\scripts, containing only this;
@echo off
"C:\Program Files\7-zip\7za.exe" %*
I changed my script to this;
SET zip="c:\program files\7-zip\7za.exe" a dependencies.7z
instead of this;
SET zip=7za a dependencies.7z
and it worked flawlessly.
The moral of the story...
Avoid calling other batch files from within a batch file. If you do, you will need to prefix them with "call".