Analisar string usando script em lote

Analisar string usando script em lote

Como posso analisar string usando script em lote?

O objetivo é salvar em um array tudo o que está abaixo Import:e retirar, #headpor exemplo --> //MPackages/Project/config/abc.txte //Packages/Project/config/cde.txt.

teste.txt:

Version: 4.5.0
Import:
   //MPackages/Project/config/abc.txt                       #head
   //Packages/Project/config/cde.txt                        #head
View:
  //MPackages/Project/config/ac.txt                     #head
  //Packages/Project/config/de.txt                      #head

Minha tentativa:

@echo off

set buildlog="devel.p4inc"

setlocal EnableDelayedExpansion
for /F "tokens=*" %%A in  (devel.p4inc) do  (
  if /i "%%A"=="Import:" set "import=true"
  IF DEFINED import (echo %%A)
)

saída desejada

   //MPackages/Project/config/abc.txt 
   //Packages/Project/config/cde.txt

qualquer coisa em Importar:

Responder1

Um dos principais problemas da sua lógica é que você define a variável "import" uma vez se algo for verdade, mas nunca a reinicia ou a indefinida se não for mais verdade. Assim, após a primeira vez que for definido, ele permanecerá "definido" pelo resto do loop.

Minha preferência é definir a variável especificamente ( trueou false). Configure-o para falseiniciar e, em seguida, configure-o truecomo desejado, mas também certifique-se de configurá-lo novamente para falsequando precisar. Então, a cada iteração do loop, verifique se a variável está especificamente definida Trueou Falseem vez de verificar se está apenas definida.

Este código funciona para mim com base em suas informações/objetivos:

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

Definimos propositalmente a variável (sinalizador) "Importar" como para falsecomeçar.

O primeiro loop For passa por cada linha do arquivo ( test.txtneste exemplo, conforme especificado pela variável "buildlog"; nota: você precisa remover as aspas ao redor do nome do arquivo na variável para que ele funcione no loop For) .

O primeiro IF verifica se a linha atual é a linha "Import:" e, em caso afirmativo, inverte o sinalizador "import" 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 interromper o processamento de cada linha.

O terceiro IF verifica se o sinalizador "import" é truee, em caso afirmativo, processa a linha.

Se for, trueo (4º) IF aninhado verifica se a linha é a linha "import:" real e, se não, exibe a linha (evita que ela mostre a linha "Import:" na saída).

O segundo loop For passa pela 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:

Editar após comentários:

Para lidar com a linha "View:" se ela tiver um número de versão depois dela, você pode 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 loop For adicionado puxará o primeiro token da linha para verificar se é "Visualizar:" ou "Importar:" em vez de verificar a linha inteira. Ignorando efetivamente qualquer coisa após o primeiro espaço encontrado na linha para fazer a verificação.

Responder2

@echo off
for /F "usebackq tokens=1" %%A in  ("devel.p4inc") do  (
Set temp=False
if "%%A" == "View:" Goto Exit
if  not "%%A" == "Import:" if  not "%%A" == "Version:"  echo %%A
)
:Exit

Responder3

linha de comando:

powershell [string]$f=gc test.txt;$pL=$f.IndexOf('Import:')+7;$pR=$f.IndexOf('View:');$s=$f.Substring($pL,$pR-$pL);$s -split'#head'^|ac result.txt

shell do poder:

powershell ./parsefl.ps1

parsefl.ps1

[string]$f=gc test.txt;
$pL=$f.IndexOf('Import:')+'Import:'.Length;$pR=$f.IndexOf('View:');
$s=$f.Substring($pL,$pR-$pL);
$s -split'#head'|ac result.txt

informação relacionada