2016-07-14 9 views
0

This Lösung schlägt vor, eine innere FOR-Schleife innerhalb einer äußeren FOR-Schleife durch Verwenden der BREAK-Variable zu unterbrechen und den gesamten Schleifencode innerhalb "wenn nicht definiert break" Klammer zu halten. Es funktioniert jedoch nicht in dem Fall unten, wo die "gesetzten" inneren Klammern sich mit jeder äußeren Schleifeniteration ändern, um die Gesamtlaufzeit zu minimieren, und ECHO wird verwendet, um zu überprüfen, ob die innere Schleife noch eine potentiell lange vars-Liste durchläuft wenn der Code innerhalb der IF-Bedingung nicht ausgeführt wird. Ohne ECHO ist es schwer zu überprüfen.Brechen einer Batch-FOR-Schleife mit einer Änderungsmenge

Die Frage ist: Gibt es eine Möglichkeit, die innere Schleife zu brechen, falls sich ihr "Set" ändert?

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 
set "vars=1 2 3 4 5 6" & set "cars= a b c d e f" 

for %%p in (%vars%) do (set "break=" & echo/ 
    for %%k in (!cars!) do (echo '!break!' 
     if not defined break (set "%%k=%%p" & echo %%k=%%p 
      set "cars=!cars: %%k=!" & echo '!cars!' & set break=TRUE))) 

exit /b 

:: Output 
'' 
a=1 
' b c d e f' 
'TRUE' 
'TRUE' 
'TRUE' 
'TRUE' 
'TRUE' 

'' 
b=2 
' c d e f' 
'TRUE' 
'TRUE' 
'TRUE' 
'TRUE' 

'' 
c=3 
' d e f' 
'TRUE' 
'TRUE' 
'TRUE' 

'' 
d=4 
' e f' 
'TRUE' 
'TRUE' 

'' 
e=5 
' f' 
'TRUE' 

'' 
f=6 
'' 
+0

Verwandte: [.bat aus mehreren verschachtelten Schleife brechen, nachdem die entsprechende Liste Finishing] (http://stackoverflow.com/questions/37040273/bat-break-out-of-multiple-nested-loop Nach der Fertigstellung der jeweiligen Liste/37041525 # 37041525) – aschipfl

+0

Gibt es einen Tippfehler: 'uars' (eingestellt, aber nie benutzt) und' cars' (nie voreingestellt)? – aschipfl

+0

Korrigiert. Vielen Dank. :) – sambul35

Antwort

-1

Dieser Ausschnitt zeigt, daß eine zweite FOR-Schleife mit wechselnder „set“ bricht, wenn es von der ersten Schleife als Außen Funktion aufgerufen wird.

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 
set "vars=1 2 3 4 5 6" & set "cars= a b c d e f" 

for %%p in (%vars%) do (set "break=" & echo/ 
    call :loop) 
exit /b 

:loop 
for %%k in (!cars!) do (echo '!break!' 
    if not defined break (set "%%k=%%p" & echo %%k=%%p 
     set "cars=!cars: %%k=!" & echo '!cars!' & set break=TRUE & exit /b)) 
exit /b 

:: Output 
'' 
a=1 
' b c d e f' 

'' 
b=2 
' c d e f' 

'' 
c=3 
' d e f' 

'' 
d=4 
' e f' 

'' 
e=5 
' f' 

'' 
f=6 
'' 
+0

Das sollte nicht als Antwort gepostet werden, da es nur ein paar zusätzliche Informationen für die Frage gibt, also solltest du lieber (http://stackoverflow.com/posts/38368159/edit) die Frage stellen ... jedenfalls Die Antwort ist: ** nein **, es gibt keine andere Methode, es gibt keinen 'exit for'-Befehl wie in einigen Sprachen; tatsächlich bricht sogar der Subroutinen-Ansatz, der 'exit/B' oder' goto: outside_of_loop' verwendet, die Schleife tatsächlich nicht wirklich ab oder verlässt sie, weil sie im Hintergrund iteriert; aber der Kontext des eingeklammerten Blocks ist gebrochen; Aus diesem Grund können Sie "goto: label" nicht innerhalb einer Schleife verwenden ... – aschipfl

+0

Das oben genannte liefert eine Antwort für den Fall, dass sich die 2. Schleife "set" während der 1. Schleifeniteration ändert. Das wurde vorher nie nach meiner Suche angesprochen. GOTO: Label bricht jedoch nicht die 2. Schleife in meinem Test, ohne eine Funktion zu verwenden, unabhängig davon, ob sich die zweite Schleife "set" ändert oder nicht. Stattdessen bricht es beide Schleifen zusammen. – sambul35

+0

@aschipfl Die Funktionsmethode bricht tatsächlich die 2. Schleife. Es beendet NICHT die "set" Iteration im Hintergrund, wie oben in meiner Antwort Ausgabe Abschnitt gezeigt, im Gegensatz zu nicht-funktionsbasierten Methode. :) GOTO: Label-Methode funktioniert möglicherweise, wenn außerhalb der inneren Schleife platziert. – sambul35