![Analizar cadena usando script por lotes](https://rvso.com/image/1449110/Analizar%20cadena%20usando%20script%20por%20lotes.png)
¿Cómo puedo analizar una cadena usando un script por lotes?
El objetivo es guardar en una matriz todo lo que hay debajo Import:
y eliminarlo, #head
por ejemplo --> //MPackages/Project/config/abc.txt
y //Packages/Project/config/cde.txt
.
prueba.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
Mi intento:
@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)
)
salida deseada
//MPackages/Project/config/abc.txt
//Packages/Project/config/cde.txt
cualquier cosa bajo Importar:
Respuesta1
Uno de los principales problemas en su lógica es que configura la variable "importar" una vez si algo es cierto, pero nunca la restablece o la desdefini si ya no es cierto. Entonces, después de configurarlo por primera vez, permanecerá "definido" durante el resto del ciclo.
Mi preferencia es establecer la variable específicamente ( true
o false
). Configúrelo para false
comenzar, luego configúrelo true
como desee, pero también asegúrese de volver a configurarlo false
cuando lo necesite. Luego, en cada iteración del bucle, verifique si la variable está configurada específicamente en True
o False
en lugar de verificar si recién está definida.
Este código funciona para mí según su información/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
)
)
)
)
Configuramos intencionalmente la variable "Importar" (bandera) para false
comenzar.
El primer bucle For recorre cada línea del archivo ( test.txt
en este ejemplo, según lo especificado por la variable "buildlog"; nota: debe eliminar las comillas alrededor del nombre del archivo en la variable para que funcione en el bucle For) .
El primer IF ve si la línea actual es la línea "Importar:" y, de ser así, cambia el indicador "importar" a true
.
El siguiente IF ve si la línea actual es la línea "Ver:" y, de ser así, cambia el indicador "importar" (de nuevo a) false
, para que deje de procesar cada línea.
El tercer IF verifica si ese indicador de "importación" es true
y, de ser así, procesa la línea.
Si es true
así, entonces el IF anidado (cuarto) verifica si la línea es la línea "importar:" real y, si no, muestra la línea (evita que muestre la línea "Importar:" en la salida).
El segundo bucle For recorre la línea que queremos que se muestre y extrae solo el primer conjunto de tokens que es (solo) la ruta que desea, dejando fuera el archivo #head
.
Más/información relacionada:
- Expansión variable en bucles FOR
- ¿Cómo dividir una cadena en un archivo por lotes de Windows?
- Operadores lógicos (“y”, “o”) en lotes de DOS
Editar después de los comentarios:
Para tratar con la línea "Ver:" si tiene un número de versión después, puede modificar el código a 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 bucle For agregado extraerá el primer token de la línea para verificar si es "Ver:" o "Importar:" en lugar de verificar toda la línea. Ignorando efectivamente cualquier cosa después del primer espacio que encuentra en la línea para realizar la verificación.
Respuesta2
@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
Respuesta3
línea 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
potencia Shell:
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