Как прочитать строки из текстового файла в порядке, представленном с помощью пакетного сценария Windows?

#batch-file #formatting

Вопрос:

У меня есть текстовый файл, который выглядит так

 number 1
some junk goes here
fruit: apple
number 2
some stuff goes here
fruit: banana
number 3
some stuff goes here
fruit: orange
 

Мой сценарий выглядит так

 @echo off

setlocal EnableDelayedExpansion

set input_file=testfile.txt

for /f "tokens=2" %%a in (
    'findstr " 1 2 3" %input_file%'
) do echo      %%a

for /f "tokens=*" %%b in (
    'findstr "fruit" %input_file%'
) do echo      %%b
 

Мой текущий код дает мне это

 1
2
3
fruit: apple
fruit: banana
fruit: orange
 

Как мне получить вывод в таком формате?

 1
fruit: apple
2
fruit: banana
3
fruit: orange
 

Заранее спасибо.

Ответ №1:

Вы можете использовать параметры маркеров и разделителей команды FOR в своих интересах. Затем используйте команду IF, чтобы определить, какую строку она обрабатывает.

 @echo off

set input_file=testfile.txt

for /f "tokens=1* delims= " %%G in ('findstr /RIC:"number [1-9]*" /IC:"fruit:" %input_file%') do (
    IF /I "%%G"=="number" echo %%H
    IF /I "%%G"=="fruit:" echo %%G %%H
)
 

Выход

 C:UsersSquashmanDesktop>so.bat
1
fruit: apple
2
fruit: banana
3
fruit: orange
 

Комментарии:

1. Я бы не стал беспокоиться о том, какие данные могут содержаться в качестве возможного второго токена, разрешите ему быть чем угодно или ничем, а затем используйте if / else, как указано в двух if : @(For /F "Tokens=1,*" %%G In ('%SystemRoot%System32findstr.exe /RIC:"^number *" /C:"^fruit: *" "testfile.txt" 2^>NUL') Do @If /I "%%G" == "fruit:" (Echo %%G %%H) Else Echo(%%H) amp; Pause

Ответ №2:

Пример кода, который вы опубликовали, не дает показанного вами результата.

Я все еще скептически относился к публикации ответа, поскольку я не на 100% уверен в том, каковы ваши фактические требования, но я подумал, учитывая текущий пример, почему бы и нет.

 @echo off
set "inputfile=testfile.txt"
for /f "tokens=1,2*" %%i in ('type "%inputfile%"') do (
    echo %%j | findstr /RC:"[0-9]"
    echo %%i %%j | findstr "fruit"
)
 

Это может быть далеко не то, что вы хотите, но, учитывая текущие примеры, это все, в чем я могу помочь прямо сейчас.

Идея этого ответа на самом деле состоит в том, чтобы продемонстрировать, что мы используем один цикл, а не два. То, как вы попытались это сделать, создаст первый набор, а затем следующий, что, очевидно, не то, что вам требовалось.

Комментарии:

1. Я отредактировал пример кода, чтобы включить setlocal EnableDelayedExpansion во второй строке. Я надеюсь, что это немного прояснит ситуацию. Я подумал, что это должен быть один цикл с несколькими командами, но ваш пример не работает для меня. Я получаю «Синтаксис команды неверен» с вашим кодом.

2. Не делая смешных правок, скопируйте мой код еще раз и попробуйте, вы не сможете получить синтаксические ошибки с ним как есть. в любом случае, ваше редактирование не делает это более ясным. delayedexpansion используется для расширения во время выполнения, что в данном случае ничего не делает для причины. Есть еще 2 цикла for, которые вызовут проблему. Первый цикл завершится предоставлением числового результата, затем второй, который предоставит результат с фруктами, поэтому вам нужно выполнить его в одном цикле, как показано здесь.