2011-01-17 25 views
16

Amacım, iki dosyayı satır satır karşılaştırmak ve değişiklikleri yakalamak. Bunun için iki iç içe döngüler kullanıyorum. Bazı durumlarda iç döngüyü frenlemem gerekiyor.İç döngüyi iç içe döngü kümesi komut dosyasında nasıl kesilir?

Kırmak için iç döngü dışında etiket kullanıyorum ancak çalışmıyor. Dış döngüyü de etiketlemekte ve sonlandırmaktadır.

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

Herkes yardımcı olabilir ....? Tekerleği yeniden icat etmek zorunda değilsiniz (eğer bir seçeneğiniz varsa).

cevap

1

. Bu sadece bir yol. Pencereler için diffutils indirin ve sonra sadece

diff sample.txt test.txt 
15

bir goto ifadesi yapabilirsiniz: etiket her zaman tüm döngüler kırar.

Ama iç döngüsünü ayrılmış bir işleve koyabilirsiniz, sonra işe yarayabilir.

@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 

Bir söylemek, İÇİN/L döngülerinin kopma beklendiği gibi çalışmıyor, For döngüsü her zaman sonuna kadar saymak, ama bunu bölerseniz, iç kod yürütme durdurulur, ama olabilir gerçekten yavaş ol.

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

DÜZENLEME: kavramının

Kanıtı

@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 

Çıktı

etikete atla döngü olsa bile
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

f bir % D% yazdırılır. koşul doğruysa, sonraki etiketini alacak ve her iki döngü de sona erecektir. Amacım, bir sonraki etiket üzerine ulaştıktan sonra tekrar 1. dönüme geçmeli ve bir sonraki değer için aynı kontrolü yapmalı. Mevcut durumda sadece 1. değeri kontrol edecektir. –

+0

Hayır işe yaramalı, örneğime bir göz atmayı dene – jeb

+0

OP gibi görünüyordu, örneğin iç döngüde 'X' kırmak, dış döngüde bir sonraki değere ve özgeçmişine geçecekti. X 'den iç döngü. Eğer hatalıysam OP'nin beni düzelteceğini umuyorum. –

3

, aynı zamanda döngü söner bağlamı. Bu

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

gibi bu Bu, aynı zamanda, aynı durumu