Одна из основных проблем в вашей логике заключается в том, что вы устанавливаете переменную "import" один раз, если что-то верно, но никогда не сбрасываете ее или не определяете, если она больше не соответствует действительности. Таким образом, после первой установки он останется "определенным" до конца цикла.
Я предпочитаю устанавливать переменную специально (true
или false
). Установите значение false
чтобы начать, затем установите значение true
как требуется, но также убедитесь, что вы вернули значение false
когда это необходимо. Затем на каждой итерации цикла проверяйте, установлена ли переменная на True
или False
вместо проверки, определена ли она просто.
Этот код работает для меня на основе вашей информации / целей:
@echo off
setlocal EnableDelayedExpansion
set buildlog=test.txt
set import=false
for /F "tokens=*" %%A in (%buildlog%) do (
if /i "%%A"=="Import:" (
set import=true
)
if /i "%%A"=="View:" (
set import=false
)
if !import!==true (
if not "%%A"=="Import:" (
for /F "tokens=1" %%B in ("%%A") do (
echo %%B
)
)
)
)
Мы целенаправленно устанавливаем переменную (флаг) "Импорт" в false
для начала.
Первый цикл For проходит каждую строку в файле (в этом примере test.txt
, как указано в переменной buildlog); примечание: вам нужно удалить кавычки вокруг имени файла в переменной, чтобы он работал в For -loop).
Первый IF определяет, является ли текущая строка строкой «Import:», и, если это так, он устанавливает флаг "import" в значение true
.
Следующий IF определяет, является ли текущая строка строкой «View:», и, если это так, он переключает флаг "import" (обратно) в false
, чтобы остановить обработку каждой строки.
3-й IF проверяет, является ли этот флаг "import" true
, и если да, то обрабатывает строку.
Если это true
то вложенный (4-й) IF затем проверяет, является ли строка фактической строкой «import:», и, если нет, отображает строку (не дает показывать строку «Import:» в выходных данных).
Второй цикл For проходит через строку, которую мы хотим отобразить, и извлекает только первый набор токенов, который (просто) путь, который вы хотите, #head
.
Больше / связанная информация:
Редактировать после комментариев:
Чтобы иметь дело со строкой «View:», если после нее есть номер версии, вы можете изменить код на что-то вроде:
@echo off
setlocal EnableDelayedExpansion
set buildlog=test.txt
set import=false
for /F "tokens=*" %%A in (%buildlog%) do (
for /F "tokens=1" %%B in ("%%A") do (
if /i "%%B"=="Import:" (
set import=true
)
if /i "%%B"=="View:" (
set import=false
)
if !import!==true (
if not "%%B"=="Import:" (
for /F "tokens=1" %%C in ("%%A") do (
echo %%C
)
)
)
)
)
Этот добавленный цикл For вытянет первый токен из строки, чтобы проверить, является ли он «View:» или «Import:» вместо проверки всей строки. Эффективно игнорируя что-либо после первого пробела, встреченного в строке для проверки.