Edit
Attach
Printable
topic end
<!-- * Set TOPICTITLE = Claus Brod: Batch-as-batch-can! (27 Jan 2006) --> <style type="text/css"> pre {background-color:#ffeecc;} </style> %STARTINCLUDE% <a name="#27"></a> ---+++ [[BlogOnSoftware20060127][Batch-as-batch-can!]] (27.1.2006) So here I confess, not without a certain sense of pride: Sometimes I boldly go where few programmers like to go - and then I write a few lines in DOS batch language. Most of the time, it's not as bad as many people think. Its bad reputation mostly stems from the days of DOS and Windows 95, but since the advent of Windows NT, the command processor has learnt quite a few new tricks. While its syntax remains absurd enough to drive some programmers out of their profession, you can now actually accomplish most typical scripting tasks with it. In particular, the [[http://www.robvanderwoude.com/ntfor.html][for]] statement is quite powerful. Anyway - a while ago, one of my batchfiles started to act up. The error message was "The system cannot find the batch label specified - copyfile". The batch file in question had a structure like this: <pre> @echo off rem copy all pdb files in the current directory into a backup directory set pdbdir=c:\temp\pdbfiles for /r %%c in (*.pdb) do call :copyfile "%%c" %pdbdir% if errorlevel 1 echo Error occurred while copying pdb files echo All pdb files copied. goto :eof rem copyfile subroutine :copyfile echo Copying %1 to %2... copy /Y %1 %2 >nul goto :eof </pre> I know what you're thinking - no, this is _not_ the problem. This _is_ how you write subroutines in DOS batch files. Seriously. And yes, the above script can of course be replaced by a single =copy= command. The original script couldn't; it performed a few extra checks for each and every file to be copied in the =:copyfile= subroutine, but it also contained a lot of extra fluff which distracts from the actual problem, so what you're seeing here is a stripped-down version. The error message complained that the label =copyfile= could not be found. Funny, because the label is of course there. (The leading colon identifies it as a label.) And in fact, the very same subroutine could be called just fine from elsewhere in the same batch file! For debugging, I removed the =@echo off= statement so that the command processor would log all commands it executes; this usually helps to find most batch file problems. But not this one - removing the =echo= "fixed" the bug. I added the statement again - now I got the error again. Removed the =echo= statement - all is fine. Oh great. It's a [[http://en.wikipedia.org/wiki/Heisenbug][Heisenbug]]. So I added the =echo= statement back in again and stared at the script hoping to find the problem by the old-fashioned method of "flash of inspiration". No inspiration in sight, though. Not knowing what to do, I added a few _empty_ lines between the =for= and the =if errorlevel= statement and ran the script again - no error message! Many attempts later, I concluded that it's the sheer length of the script file which made the difference between smooth sailing and desperation. By the way, the above demo script works just fine, of course, because I stripped it down for publication. Google confirmed my suspicion: Apparently, there are cases where [[http://groups.google.de/group/alt.msdos.batch.nt/browse_thread/thread/b97f07323f4d82e/047b3a0bf07f090a][labels cannot be found]] even though they are most certainly in the batch file. Maybe the length of the label names matters - [[http://support.microsoft.com/default.aspx?scid=kb;en-us;63071][Microsoft Knowledge Base Article 63071]] suggests that only the first eight characters of the label are significant. However, =copyfile= has exactly eight characters! I still haven't solved this puzzle. If you're a seasoned batch file programmer sent to this place by Google and can shed some light on this, I could finally trust that script again... -- Main.ClausBrod - 27 Jan 2006 %COMMENT{type="below" nonotify="on"}% [[http://blog.nullspace.io/batch.html]["How bad is the Windows command line really?"]] -- Main.ClausBrod - 01 Apr 2016 Thanks a lot, Reinder! -- Main.ClausBrod - 05 Apr 2015 From http://help.wugnet.com/windows/system-find-batch-label-ftopict615555.html, I tentatively conclude that you need two preconditions for this to hit you: * the batch file must not use CRLF line endings * the label you jump to must span a block boundary As to your remark "And in fact, the very same subroutine could be called just fine from elsewhere in the same batch file": in my experience, the subroutine gets called just fine when you get this error. Regards, Reinder -- Reinder - 20 Jun 2008 --- %STOPINCLUDE%
to top
End of topic
Skip to action links
|
Back to top
Edit
|
Attach image or document
|
Printable version
|
Raw text
|
Refresh
|
More topic actions
Revisions: | r1.4 |
>
|
r1.3
|
>
|
r1.2
|
Total page history
|
Backlinks
You are here:
Blog
>
BlogOnSoftware20060127
r1.4 - 01 Apr 2016 - 05:55 -
ClausBrod
to top
Blog
This site
2017
:
12
-
11
-
10
2016
:
10
-
7
-
3
2015
:
11
-
10
-
9
-
4
-
1
2014
:
5
2013
:
9
-
8
-
7
-
6
-
5
2012
:
2
-
10
2011
:
1
-
8
-
9
-
10
-
12
2010
:
11
-
10
-
9
-
4
2009
:
11
-
9
-
8
-
7
-
6
-
5
-
4
-
3
2008
:
5
-
4
-
3
-
1
2007:
12
-
8
-
7
-
6
-
5
-
4
-
3
-
1
2006:
4
-
3
-
2
-
1
2005:
12
-
6
-
5
-
4
2004:
12
-
11
-
10
C++
CoCreate Modeling
COM & .NET
Java
Mac
Lisp
OpenSource
Scripting
Windows
Stuff
Changes
Index
Search
Maintenance
Impressum
Datenschutzerklärung
Home
Webs
Atari
Blog
Claus
CoCreateModeling
Klassentreffen
Main
Sandbox
Sommelier
TWiki
Xplm
Jump:
Copyright © 1999-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki?
Send feedback