MY goal is to compare two files line by line and capture the changes. For that i am using two nested loops. I am stuck with braking the inner loop on some condition.
<A goto :label always breaks all loops.
But you can put your inner loop in a separated function, then it could work.
@echo off
SETLOCAL EnableDelayedExpansion
for /F "skip=8 tokens=* delims=." %%a in (sample.txt) do (
call :myInnerLoop "%%a"
)
echo out of inner loop
)
goto :eof
:myInnerLoop
for /F "skip=8 tokens=* delims=." %%b in (test.txt) do (
if "%~1"=="%%b" (
goto :next
) else (
echo %%a
)
:next
goto :eof
One remark, breaking of FOR /L loops does not work as expected, the for-loop always count to the end, but if you break it, the execution of the inner code is stopped, but it could be really slow.
@echo ON
FOR /L %%n IN (1,1,1000000) DO (
echo %%n - count
goto :break
)
:break
EDIT:
Proof of concept
@echo off
SETLOCAL EnableDelayedExpansion
for %%a in (a b c) DO (
echo Outer loop %%a
call :inner %%a
)
goto :eof
:inner
for %%b in (U V W X Y Z) DO (
if %%b==X (
echo break
goto :break
)
echo Inner loop Outer=%1 Inner=%%b
)
:break
goto :eof
Output
Outer loop a
Inner loop Outer=a Inner=U
Inner loop Outer=a Inner=V
Inner loop Outer=a Inner=W
break
Outer loop b
Inner loop Outer=b Inner=U
Inner loop Outer=b Inner=V
Inner loop Outer=b Inner=W
break
Outer loop c
Inner loop Outer=c Inner=U
Inner loop Outer=c Inner=V
Inner loop Outer=c Inner=W
break
you do not have to reinvent the wheel (if you have a choice). This is just one way. Download diffutils for windows and then you can just do
diff sample.txt test.txt
Even if the goto label is in the for loop, it also goes out the loop context. Such as
@echo off
for %%d in (A B) do (
echo %%d
for %%f in ( 1 2 ) do (
goto loop
:loop
echo %%d %%f
)
)
This will print out A %d %f