2011-01-17 19 views
16

MI objetivo es comparar dos archivos línea por línea y capturar los cambios. Para eso estoy usando dos bucles anidados. Estoy atascado con el frenado del circuito interno en alguna condición.Cómo romper el ciclo interno en secuencia de comandos por lotes de bucle anidado

Estoy usando una etiqueta fuera del lazo interno para romperlo, pero no funciona. Va a etiquetar y terminar el bucle externo también.

@ echo off 
SETLOCAL EnableDelayedExpansion 
for /F "skip=8 tokens=* delims=." %%a in (sample.txt) do (for /F "skip=8 tokens=* delims=." %%b in (test.txt) do (if %%a==%%b (goto :next) else (echo %%a) 
) 
: Next 
echo out of inner loop 
) 

Cualquiera puede ayudar ...?

Respuesta

1

no tiene que reinventar la rueda (si puede elegir). Esta es solo una forma. Descargar diffutils para las ventanas y entonces sólo puede hacer

diff sample.txt test.txt 
15

Un Goto: etiqueta siempre se rompe todos los lazos.

Pero puede poner su lazo interno en una función separada, entonces podría funcionar.

@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 

Una observación, ruptura de lazos para/L no funciona como se esperaba, el ciclo for contar siempre hasta el final, pero si usted lo rompe, se detiene la ejecución del código interno, pero podría hacerlo se muy lento

@echo ON 
FOR /L %%n IN (1,1,1000000) DO (
    echo %%n - count 
    goto :break 
) 
:break 

EDIT:

Prueba de concepto

@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 

salida

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 
+0

Esto también está haciendo lo mismo. si la condición es verdadera, irá a la siguiente etiqueta y luego ambos bucles terminarán. Mi propósito es que, después de llegar a la etiqueta siguiente, vuelva al primer ciclo y verifique lo mismo para el siguiente valor. En el caso actual, solo comprobará el 1er valor. –

+0

No debería funcionar, eche un vistazo a mi muestra – jeb

+0

Parece que si el OP quisiera que al romper, por ejemplo, 'X' en el lazo interno se movería al siguiente valor en el bucle externo y se resumiría el bucle interno de 'X'. Espero que el OP me corrija si me equivoco. –

3

Incluso si la etiqueta se salta en el bucle, también se apaga el bucle contexto. Tal como

@echo off 
for %%d in (A B) do (
    echo %%d 
    for %%f in (1 2) do (
     goto loop 
     :loop 
     echo %%d %%f 
    ) 
) 

Esto imprimirá A % d% f

Cuestiones relacionadas