2011-01-17 11 views
16

Moim celem jest porównanie dwóch plików wiersz po linii i przechwycenie zmian. Do tego używam dwóch zagnieżdżonych pętli. Utknąłem z hamowaniem wewnętrznej pętli w pewnym stanie.Jak przerwać pętlę wewnętrzną w skrypcie wsadowym z pętlą zagnieżdżoną

Używam etykiety poza wewnętrzną pętlą, aby ją złamać, ale nie działa. Przechodzi do etykiety i kończy również zewnętrzną pętlę.

@ 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 
) 

Ktoś może pomóc ....?

Odpowiedz

1

nie musisz wymyślać koła (jeśli masz wybór). To tylko jeden sposób. Pobierz diffutils do okien, a następnie można po prostu zrobić

diff sample.txt test.txt 
15

GoTo: etykieta zawsze łamie wszystkie pętle.

Ale możesz umieścić swoją wewnętrzną pętlę w oddzielnej funkcji, wtedy może działać.

@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 

Jedna uwaga, łamanie pętli/L nie działa zgodnie z oczekiwaniami, dla pętli zawsze liczyć do końca, ale jeśli rozbicie go, wykonanie kodu wewnętrznego jest zatrzymany, ale może bądź naprawdę powolny.

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

EDIT:

Dowód koncepcji

@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 

Wyjście

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

to również robi to samo. jeśli warunek jest prawdziwy, to będzie goto etykieta obok, a następnie obie pętle się skończy. Moim celem jest, aby po dotarciu do następnej etykiety ponownie przejść do pierwszej pętli i sprawdzić to samo dla następnej wartości. W tym przypadku sprawdzi tylko 1. wartość. –

+0

Nie, to powinno zadziałać, spróbuj spojrzeć na moją próbkę. – jeb

+0

Wygląda na to, że OP chciał, aby przy włamywaniu na przykład 'X' w wewnętrznej pętli przesunąłby się do następnej wartości w zewnętrznej pętli i rodzaju wznowienia wewnętrzna pętla z 'X'. Mam nadzieję, że PO poprawi mnie, jeśli się mylę. –

3

Nawet jeśli etykieta goto jest w pętli, ale także wychodzi z pętli kontekst. Takich jak

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

To wydrukować A % d% f

Powiązane problemy