Командный процессор Windows, предназначенный для выполнения команд и исполняемых файлов, а не для обработки текстовых файлов, безусловно, является худшим выбором для фильтрации TEST.LOG
.По причинам, полностью прочитанным в моем ответе на Как читать и печатать содержимое текстового файла построчно? Детально описанный там код пакетного файла использовался в качестве шаблона для кода пакетного файла ниже:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
if not exist "Test.log" goto EndBatch
set "OutputLines="
(for /F delims^=^ eol^= %%I in ('%SystemRoot%\System32\findstr.exe /N "^" "Test.log"') do (
set "Line=%%I"
setlocal EnableDelayedExpansion
if defined OutputLines (
echo(!Line:*:=!
if not "!Line:</Report>=!" == "!Line!" (
endlocal & set "OutputLines="
) else endlocal
) else if not "!Line:<Line Text=!" == "!Line!" (
echo(!Line:*:=!
endlocal & set "OutputLines=1"
) else endlocal
))>"newfile.txt"
if exist "newfile.txt" for %%I in ("newfile.txt") do if %%~zI == 0 del "newfile.txt"
:EndBatch
endlocal
Этот пакетный файл записывает все строки из строки, содержащей без учета регистра строку <Line Text
, в строку, содержащую без учета регистра строку </Report>
или конец файла из Test.log
в файл newfile.txt
.
Примечание: Строка поиска между !Line:
и =
не может содержать знак равенства, поскольку знак равенства интерпретируется командным процессором Windows как разделитель между строкой поиска, здесь </Report>
и <Line Text
, и строка замены, здесь дважды пустая строка.А звездочка *
в начале строки поиска интерпретируется командным процессором Windows как порядок замены всего от начала строки до первого появления найденной строки при выполнении подстановки строки, а не в качестве символа для поиска в строке.Но это не имеет значения для этого варианта использования.
Если две строки, отмечающие начало и конец извлекаемого блока, являются фиксированными и не содержат какой-либо переменной части, сравнение двух строк может быть выполнено без подстановки строки, что делаетМожно также сравнивать строки, содержащие знак равенства.
@echo off
setlocal EnableExtensions DisableDelayedExpansion
if not exist "Test.log" goto EndBatch
set "BlockBegin= <Line Text="***********TEST1 TEST TEST************" />"
set "BlockEnd= </Report>"
set "OutputLines="
(for /F delims^=^ eol^= %%I in ('%SystemRoot%\System32\findstr.exe /N "^" "Test.log"') do (
set "Line=%%I"
setlocal EnableDelayedExpansion
if defined OutputLines (
echo(!Line:*:=!
if "!Line:*:=!" == "!BlockEnd!" (
endlocal & set "OutputLines="
) else endlocal
) else if "!Line:*:=!" == "!BlockBegin!" (
echo(!Line:*:=!
endlocal & set "OutputLines=1"
) else endlocal
))>"newfile.txt"
if exist "newfile.txt" for %%I in ("newfile.txt") do if %%~zI == 0 del "newfile.txt"
:EndBatch
endlocal
Этот вариант сравнивает каждую строку с учетом регистра со строками, присвоенными переменным среды BlockBegin
и BlockEnd
, чтобы определить, с какой строки начинатьи в какой строке останавливать вывод строк.
Для понимания используемых команд и их работы откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.очень осторожно.
del /?
echo /?
endlocal /?
findstr /?
for /?
goto /?
if /?
set /?
setlocal /?
Смотри также: