How to break inner loop in nested loop batch script

前端 未结 3 1706
广开言路
广开言路 2020-12-15 06:38

MY goal is to compare two files line by line and capture the changes. For that i am using two nested loops. I am stuck with braking the inner loop on some condition.

<
相关标签:
3条回答
  • 2020-12-15 07:16

    A goto :label always breaks all loops.

    But you can put your inner loop in a separated function, then it could work.

    @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
    

    One remark, breaking of FOR /L loops does not work as expected, the for-loop always count to the end, but if you break it, the execution of the inner code is stopped, but it could be really slow.

    @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
    

    Output

    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 讨论(0)
  • 2020-12-15 07:23

    you do not have to reinvent the wheel (if you have a choice). This is just one way. Download diffutils for windows and then you can just do

    diff sample.txt test.txt
    
    0 讨论(0)
  • 2020-12-15 07:30

    Even if the goto label is in the for loop, it also goes out the loop context. Such as

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

    This will print out A %d %f

    0 讨论(0)
提交回复
热议问题