#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, которые вызовут проблему. Первый цикл завершится предоставлением числового результата, затем второй, который предоставит результат с фруктами, поэтому вам нужно выполнить его в одном цикле, как показано здесь.