2

Как я могу разобрать строку, используя пакетный скрипт?

Цель состоит в том, чтобы сохранить в массиве все, что находится под Import: и #head например -> //MPackages/Project/config/abc.txt и //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

Моя попытка:

@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

что-нибудь под Импорт:

3 ответа3

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 -loop).

Первый IF определяет, является ли текущая строка строкой «Import:», и, если это так, он устанавливает флаг "import" в значение true .

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

3-й IF проверяет, является ли этот флаг "import" 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:» вместо проверки всей строки. Эффективно игнорируя что-либо после первого пробела, встреченного в строке для проверки.

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
0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .