Подтвердить что ты не робот

Как разбить внутренний цикл в пакетном вложенном цикле script

Моя цель - сравнить два файла по строкам и зафиксировать изменения. Для этого я использую два вложенных цикла. Я застрял при торможении внутренней петли в каком-то состоянии.

Я использую ярлык за пределами внутреннего цикла для его разрыва, но не работает. Он также относится к метке и завершает внешний цикл.

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

Любой может помочь...?

4b9b3361

Ответ 1

A goto: label всегда разбивает все циклы.

Но вы можете поместить свой внутренний цикл в разделенную функцию, тогда он может работать.

@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

EDIT:

Доказательство концепции

@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

Ответ 2

Даже если метка 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

Ответ 3

вам не нужно изобретать велосипед (если у вас есть выбор). Это один из способов. Скачайте diffutils для окон, а затем вы можете просто сделать

diff sample.txt test.txt