Разбор строки с использованием пакетного скрипта

Разбор строки с использованием пакетного скрипта

Как проанализировать строку с помощью пакетного скрипта?

Цель состоит в том, чтобы сохранить в массиве все, что находится ниже Import:, и удалить, #headнапример, --> //MPackages/Project/config/abc.txtи //Packages/Project/config/cde.txt.

тест.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

Моя попытка:

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

желаемый результат

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

все, что находится в разделе Импорт:

решение1

Одна из главных проблем в вашей логике заключается в том, что вы устанавливаете переменную "import" один раз, если что-то истинно, но никогда не сбрасываете ее или не делаете ее неопределенной, если она больше не истинна. Таким образом, после того, как она была установлена ​​в первый раз, она останется "определенной" для остальной части цикла.

Я предпочитаю устанавливать переменную специально ( trueили false). Установите ее в значение falseдля начала, затем установите ее trueв нужное значение, но затем убедитесь, что вы устанавливаете ее обратно в нужное значение, falseкогда вам это нужно. Затем, на каждой итерации цикла проверяйте, установлена ​​ли переменная специально Trueили Falseвместо проверки, определена ли она просто.

Этот код работает для меня на основе вашей информации/целей:

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

Мы намеренно устанавливаем переменную (флаг) «Импорт» в значение для falseначала.

Сначала цикл For проходит по каждой строке в файле ( test.txtв этом примере, как указано в переменной «buildlog»; примечание: вам необходимо удалить кавычки вокруг имени файла в переменной, чтобы она работала в цикле For).

Первый IF проверяет, является ли текущая строка строкой «Импорт:», и если да, то меняет флаг «импорт» на true.

Следующий IF проверяет, является ли текущая строка строкой «View:», и если это так, он переключает флаг «import» (обратно) на false, чтобы прекратить обработку каждой строки.

Третий IF проверяет, установлен ли флаг «импорта» true, и если да, то обрабатывает строку.

Если это trueтак, то вложенный (4-й) оператор IF проверяет, является ли строка фактической строкой «import:», и если нет, отображает строку (предотвращая отображение строки «Import:» в выходных данных).

Второй цикл For проходит по строке, которую мы хотим отобразить, и извлекает только первый набор токенов, который является (как раз) нужным нам путем, опуская #head.

Дополнительная/сопутствующая информация:

Редактировать после комментариев:

Чтобы разобраться со строкой «View:», если после нее указан номер версии, можно изменить код следующим образом:

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

Этот добавленный цикл For вытащит первый токен из строки, чтобы проверить, является ли он "View:" или "Import:" вместо проверки всей строки. Фактически игнорируя все после первого пробела, который он встречает в строке, чтобы выполнить проверку.

решение2

@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

решение3

командная строка:

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

парсефл.пс1

[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

Связанный контент