如何在嵌套循环批处理脚本中打破内部循环

时间:2011-01-17 06:31:16

标签: windows batch-file cmd

我的目标是逐行比较两个文件并捕获更改。为此,我使用两个嵌套循环。在某些条件下,我被困在制动内圈。

我在内循环之外使用标签来打破它,但不起作用。它也用于标记和终止外循环。

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

任何人都可以帮忙......?

3 个答案:

答案 0 :(得分:15)

goto:标签总是会破坏所有循环。

但是你可以把你的内循环放在一个单独的函数中,然后就可以了。

@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

有一种说法,打破FOR / L循环不能按预期工作,for循环总是计数到最后,但是如果你打破它,内部代码的执行就会停止,但它可能真的很慢。

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

编辑:

概念证明

@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

输出

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

答案 1 :(得分:3)

即使goto标签位于for循环中,它也会循环出循环上下文。如

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

这将打印出来 一个 %d%f

答案 2 :(得分:1)

你不必重新发明轮子(如果你有选择的话)。这只是一种方式。下载diffutils for windows,然后你就可以了

diff sample.txt test.txt