![Analisar string usando script em lote](https://rvso.com/image/1449110/Analisar%20string%20usando%20script%20em%20lote.png)
Como posso analisar string usando script em lote?
O objetivo é salvar em um array tudo o que está abaixo Import:
e retirar, #head
por exemplo --> //MPackages/Project/config/abc.txt
e //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 ( true
ou false
). Configure-o para false
iniciar e, em seguida, configure-o true
como desejado, mas também certifique-se de configurá-lo novamente para false
quando precisar. Então, a cada iteração do loop, verifique se a variável está especificamente definida True
ou False
em 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 false
começar.
O primeiro loop For passa por cada linha do arquivo ( test.txt
neste 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" é true
e, em caso afirmativo, processa a linha.
Se for, true
o (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:
- Expansão variável em loops FOR
- Como dividir uma string em um arquivo em lote do Windows?
- Operadores lógicos (“e”, “ou”) em lote DOS
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