Analisa string usando script em lote

2

Como posso analisar uma string usando scripts em lote?

O objetivo é salvar em uma matriz tudo em Import: e remover #head , por exemplo - > //MPackages/Project/config/abc.txt e //Packages/Project/config/cde.txt .

test.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

nada em Importar:

    
por Mihir 01.05.2015 / 19:29

3 respostas

1

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:

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.

    
por 01.05.2015 / 20:23
1
@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
    
por 01.05.2015 / 20:51
0

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

powershell:

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
    
por 01.05.2015 / 22:51