Um dos principais problemas em sua lógica é que você defina a variável "import" uma vez, se algo for verdadeiro, mas nunca a redefina, ou indefinido, se não for mais verdadeiro. Então, após a primeira vez que ele é definido, ele permanecerá "definido" para o restante do loop.
Minha preferência é definir a variável especificamente ( true
ou false
). Defina-o como false
para iniciar e, em seguida, defina-o como true
, como desejado, mas também garanta que você o defina novamente como false
quando for necessário. Em seguida, em cada iteração do loop, verifique se a variável está especificamente definida como True
ou False
em vez de verificar se ela está apenas definida.
Esse código funciona para mim com base em suas informações / metas:
@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
)
)
)
)
Definitivamente, definimos a variável "Importar" (flag) como false
para iniciar.
Primeiro For-loop passa por cada linha no arquivo ( test.txt
neste exemplo, conforme especificado pela variável "buildlog"; note: você precisa remover as aspas ao redor do nome do arquivo na variável para que ele funcione no For-loop).
O primeiro IF verifica se a linha atual é a linha "Importar:" e, em caso afirmativo, inverte o sinalizador "importar" para true
.
O próximo IF verifica se a linha atual é a linha "View:" e, em caso afirmativo, inverte o sinalizador "import" (de volta para) para false
, para que pare de processar cada linha.
O 3º IF verifica se o sinalizador "import" é true
e, em caso afirmativo, processa a linha.
Se for true
, o IF aninhado (4o) verificará se a linha é a linha "import:" real e, se não, exibe a linha (evita que exiba a linha "Importar:" na saída ).
O segundo loop For percorre a linha que queremos exibir e puxa apenas o primeiro conjunto de tokens que é (apenas) o caminho que você deseja, deixando de fora o #head
.
Mais / informações relacionadas:
- Expansão variável em loops FOR
- Como dividir uma string em um lote do Windows arquivo?
- Operadores lógicos (“e”, “ou”) no lote do DOS
Editar após comentários:
Para lidar com a linha "Ver:" se tiver um número de versão depois, você poderá modificar o código para algo como:
@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
)
)
)
)
)
Este For-loop adicionado puxará o primeiro token da linha para verificar se é "View:" ou "Import:" em vez de verificar a linha inteira. Ignorar efetivamente qualquer coisa depois do primeiro espaço que encontrar na linha para fazer o teste.