Я думаю, вам просто нужно поместить его в раздел: output следующим образом:
:Output
FOR /F "SKIP=%_Line#_Begin% Tokens=* usebackq" %%_ IN ("C:\Test.log") DO (
ECHO(%%_
ECHO("%%_" | FIND /I "%_MatchString_End%" >NUL&&ECHO(&&(GOTO :EOF)
)>>"%_ResultFile%"
Ваш полный код, изменяющий кучу вещей так, как я бы с большей вероятностью это сделал. Я знаю, что Mofi действительно не нравится echo.
- но я работаю с компьютерами, которые у меня есть, и я не беспокоюсь о крошечной вероятности проблем. Если вы заботитесь об этом, вы можете заменить все echo.
на echo/
SET "_MatchString_Begin=<Line Text="**TEST**"
SET "_MatchString_End=</Report>"
SET "_Line#_Begin="
ECHO.
ECHO ===== Processing =====
ECHO.
FOR /F "Delims=[]" %%a IN ('Find /N "%_MatchString_Begin:"=""%" "C:\Test.log" ^| FIND "["') DO (
ECHO Found Match On Line %%a>>"%_ResultFile%"
SET /A "_Line#_Begin=%%a-1"
rem CALL :Output I do not understand what this line is doing here.
rem :Output I also do not understand what this line is doing here.
FOR /F "SKIP=%_Line#_Begin% Tokens=* usebackq" %%b IN ("C:\Test.log") DO (
ECHO.%%b>>"%_ResultFile%"
rem the next line is the blank line if you want it after every line in test.log
ECHO.>>"%_ResultFile%"
rem the next line also adds a blank line after finding the ending matching string
ECHO.%%b^| FIND /I "%_MatchString_End%" >NUL && (
rem what to do when we match the end string
rem blank line here if this is where you want it
echo.>>"%_ResultFile%"
GOTO :EOF
)
)
)
GOTO :EOF
Я считаю, что перенаправление каждой строки в выходной файл более понятно, чем перенаправление всего выводаfor
выписка в файл. Это приводит к повторному коду - но у вас есть возможность перенаправлять на несколько файлов или просто выводить на консоль.
Кроме того, я все еще не думаю, что это ваш настоящий код. Я должен был добавить скобки здесь и там. Возможно, секция: output должна была быть вне начального for
цикла ??
Вот что я думаю, что ваш код должен быть:
SET "_MatchString_Begin=<Line Text="**TEST**"
SET "_MatchString_End=</Report>"
SET "_Line#_Begin="
ECHO.
ECHO ===== Processing =====
ECHO.
FOR /F "Delims=[]" %%a IN ('Find /N "%_MatchString_Begin:"=""%" "C:\Test.log" ^| FIND "["') DO (
ECHO Found Match On Line %%a
SET /A "_Line#_Begin=%%a-1"
CALL :Output
echo.>>"%_ResultFile%"
)
goto :eof
:Output
FOR /F "SKIP=%_Line#_Begin% Tokens=* usebackq" %%b IN ("C:\Test.log") DO (
ECHO.%%b>>"%_ResultFile%"
ECHO.%%b| FIND "%_MatchString_End%" >NUL && GOTO :EOF
)
GOTO :EOF
В конечном счете, я бы не стал перебирать файл снова и снова. Вот что я бы сделал: UNTESTED Может легко быть незначительными ошибками, такими как пропуск ^
.
@echo off
SET "_MatchString_Begin=<Line Text="**TEST**"
SET "_MatchString_End=</Report>"
SET "_Line#_Begin="
:: output_flag is used to decide if the lines should be output or not
SET "output_flag=N"
cls
ECHO.
ECHO ===== Processing =====
ECHO.
FOR /F "usebackq tokens=*" %%a IN ("C:\Test.log") DO (
ECHO.%%a|find "%_MatchString_Begin:"=""%" && set "output_flag=Y"
if "!output_flag!"=="Y" echo.%%a>>"%_ResultFile%"
echo.%%a|find "%_MatchString_End%" >nul &&echo.>>"%_ResultFile%"&&set "output_flag=N"
)