views:

32

answers:

1

Hello all,

I have a problem with GOTO command and affiliated labels.

Facts: Given a bunch of files from a folder (they are log errors) I need to open them and check if they contain a specific string. If yes then eliminate some characters (all the chars after the last appearance of "_", including itself) from the file names and do other operations.

For cutting off the chars I'm using GOTO command in a loop manner as I found it described here: http://www.robvanderwoude.com/battech_while_loops.php

The script is:

@echo off
setlocal EnableDelayedExpansion

cls

for %%X in (D:\e-pub\outbox\logs\*.*) do (

    for /F "tokens=7" %%S in (%%X) do (

        if /i "%%S"=="<ml>" (
            SET fisier=%%~nX
            SET cond=!fisier:~-1!
            SET fisier=!fisier:~0,-1!

            :loopStart
            rem condition to break the loop
            if !cond!==_ goto loopEnd
            SET cond=!fisier:~-1!
            SET fisier=!fisier:~0,-1!
            goto loopStart

            :loopEnd

            rem here it should be out of a loop
            rem other stuff to do with var !fisier!
            rem the following line is not executed because of the label loopEnd
            echo !fisier!
        )
    )
) 

pause

The script is not running because there is an empty line after the label loopEnd?! If I'm writing any instructions right after that label they will be executed but the rest of iterations from the first for statement won't be executed (the log errors folder contains more one file)

Can someone provide help?

A: 

You got two problems.

One problem is, that a goto breaks a for-loop. The other, labels are quite difficult in parenthesis.

The goto breaks always and all nested loops, even if the label of the goto is in the same block and the for-variables are lost immediately after the jump.

In parenthesis lables are "two line" oriented! I experimented with labels and this are some results for parenthesis.

If a label occours, the next line has to been the correct format for a "secondary" line.

That's the cause why this fails.

(
:this label fails with a syntax error
)

(
:this works
:because this line is a "legal" secondary line
)

(
:: The remark style
:: fails, because it's not "legal" to use a double colon, because it's not a legal path
)

(
:and now it got courious & echo This will not echo'd
:but & echo You can see this !
)
jeb
One thing. On the second example you've introduced a second label. In the terms of cmd.exe wouldn't the second label require another "legal line"? Tnx for explanations.
Ergil
No, if a label is in the "secondary line", it does not require another "secondary line". The sec-line is parsed different than the rest, as you can see in the last example
jeb
Thank you for the answer and your time
Ergil