2011-01-17 13 views
16

Mein Ziel ist es, zwei Dateien Zeile für Zeile zu vergleichen und die Änderungen erfassen. Dafür verwende ich zwei verschachtelte Schleifen. Ich bin dabei, die innere Schleife unter bestimmten Bedingungen zu bremsen.So brechen Sie innere Schleife in verschachtelten Schleife Batch-Skript

Ich benutze Etikett außerhalb der inneren Schleife für den Bruch, aber nicht funktioniert. Es geht auch um die äußere Schleife zu beschriften und zu beenden.

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

Jeder kann helfen ....?

Antwort

1

Sie müssen das Rad nicht neu erfinden (wenn Sie die Wahl haben). Dies ist nur eine Möglichkeit. Laden Sie diffutils für Fenster und dann können Sie nur tun

diff sample.txt test.txt 
15

Eine GOTO: label immer alle Schleifen bricht.

Aber Sie können Ihre innere Schleife in einer getrennten Funktion setzen, dann könnte es funktionieren.

@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 

Eine Bemerkung, Brechen FOR/L Schleifen funktioniert nicht wie erwartet, zählen die for-Schleife immer bis zum Ende, aber wenn Sie es brechen, die Ausführung des inneren Codes gestoppt wird, aber es könnte sei wirklich langsam.

@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 

Ausgabe

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

auch das gleiche zu tun Dies Dies wird. Wenn die Bedingung wahr ist, wird sie als nächstes beschriftet und dann enden beide Schleifen. Mein Ziel ist es, nach dem Erreichen des Etiketts als nächstes wieder zur 1. Schleife zu gehen und dasselbe für den nächsten Wert zu prüfen. Im aktuellen Fall wird nur der erste Wert geprüft. –

+0

Nein sollte es funktionieren, versuchen Sie einen Blick auf meine Probe – jeb

+0

Es scheint, als ob die OP wollte, dass bei Bruch bei, zum Beispiel, X in der inneren Schleife würde es auf den nächsten Wert in der äußeren Schleife und Art der fortsetzen die innere Schleife von 'X'. Ich hoffe, das OP wird mich korrigieren, wenn ich falsch liege. –

3

Auch wenn die goto-Label für Schleife in das heißt, es geht auch um die Schleife aus Kontext. Wie

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

A % d% auszudrucken f

Verwandte Themen