![Разбор строки с использованием пакетного скрипта](https://rvso.com/image/1449110/%D0%A0%D0%B0%D0%B7%D0%B1%D0%BE%D1%80%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8%20%D1%81%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC%20%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0.png)
Как проанализировать строку с помощью пакетного скрипта?
Цель состоит в том, чтобы сохранить в массиве все, что находится ниже 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
.
Дополнительная/сопутствующая информация:
- Расширение переменных в циклах FOR
- Как разделить строку в пакетном файле Windows?
- Логические операторы («и», «или») в пакете DOS
Редактировать после комментариев:
Чтобы разобраться со строкой «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