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

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

我在内部循环之外使用标签打破它,但不工作。 它也去标签和终止外部循环。

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

任何人都可以帮助….?

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 (abc) DO ( echo Outer loop %%a call :inner %%a ) goto :eof :inner for %%b in (UVWXYZ) 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 

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

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

这将打印出A%d%f

你不必重新发明轮子(如果你有选择的话)。 这只是一个方法。 下载diffutils的窗口,然后你可以做

 diff sample.txt test.txt