Как вывести несколько строк из FINDSTR в переменную

Неудивительно, что официальная документация на самом деле не помогает понять, как команда обрабатывает результат команды вместо списка файлов, и почему она вообще называется «FOR». Да, я уже знаю, что stackoverflow полон подобных вопросов, но, по-видимому, поскольку на пакетные сценарии влияет так много «ломающих» факторов, что даже неопытному программисту трудно не потеряться в тысячах исключений и сделать- ноты, которые могут повлиять на результат. Моя цель, помимо изучения наилучшего возможного ответа, состоит в том, чтобы сформулировать достаточно общий вопрос, чтобы представить вопрос, который, вероятно, является наиболее распространенной задачей, включая команду FINDSTR:

ВОПРОС:

Как получить выходные данные FINDSTR таким образом, чтобы я мог вычислять каждую результирующую строку по очереди, возможно, ВНУТРИ цикла?

Самый «общий» (пакетный bs-доказательство, если вы понимаете, что я имею в виду) пример, который я могу сделать, следующий:

Допустим, это secret_file.txt.

some not intersting line
            A very intersting line = "secret1";
some not intersting line
            A very intersting line = "secret2";
some not intersting line
            A very intersting line = "secret3";
some not intersting line

Теперь с помощью команды findstr я могу вывести каждую «секретную» строку следующим образом:

findstr /R /C:"secret.\"" secret_file.txt
                                A very intersting line = "secret1";
                                A very intersting line = "secret2";
                                A very intersting line = "secret3";

Но этот результат просто бесполезен без дальнейшего анализа, верно? В любом случае, я мог бы использовать ctrl-F над любым текстовым читателем/редактором, скажем, теперь я хочу вывести каждую строку ОДИН ЗА РАЗ, чтобы я мог ее вычислить, например, сохраняя каждый секрет в переменную, а затем используя эта переменная каким-то образом (на самом деле не имеет значения, как, мы можем просто повторить ее, чтобы все было просто).

Теперь все согласны с тем, что для такого рода задач необходим цикл FOR. Цитируя https://ss64.com/nt/for.html в синтаксисе, мой скрипт .bat должен выглядеть так:

@echo off

FOR /F %%A IN ('findstr /R /C:"secret.\"" secret_file.txt') DO ECHO Batch script language is completely fine, good job Microsoft!

Это просто не дает никакого результата, может кто-нибудь объяснить мне, почему? Моя гипотеза заключалась в том, что выходные данные команды findstr находятся в несовместимом формате с командой FOR, не то чтобы я мог проверить или что-то в этом роде, поскольку источник закрыт, а документация даже не удосужилась определить слово String. Я готов предоставить любые подробности и даже отредактировать вопрос, чтобы он был более заметен для желающих быть забытыми Microsoft пакетными скриптами.


person Patches    schedule 04.12.2018    source источник
comment
Поскольку вы повторяете постоянный текст, содержимое обработанных строк не выводится, а только 3 раза больше вашего текста.   -  person    schedule 04.12.2018
comment
Это не имеет значения, потому что даже постоянный текст не печатается, и если бы моей целью было заставить код работать, я бы написал что-то вроде [code] для /F delims= %%a in ('findstr /c:secret secret_file. txt') do echo %%a [/code], это работает отлично, но я хотел бы понять, почему код, упомянутый в вопросе, просто не работает. Должен ли я избежать чего-то?   -  person Patches    schedule 04.12.2018


Ответы (1)


Используя "tokens=*" для удаления начальных пробелов, этот пакет использует счетчик для создания (псевдо)массива secret[]

:: Q:\Test\2018\12\04\SO_53614102.cmd
@Echo off
set Cnt=0
FOR /F "tokens=*" %%A IN (
  'findstr /R /C:"secret.\"" secret_file.txt'
) DO (
  set /a Cnt+=1
  call Set Secret[%%Cnt%%]=%%A
)
Set Secret[

Пример вывода:

> SO_53614102.cmd
Secret[1]=A very intersting line = "secret1";
Secret[2]=A very intersting line = "secret2";
Secret[3]=A very intersting line = "secret3";

Поскольку переменные в (кодовом блоке) расширяются во время синтаксического анализа,
требуется отложенное расширение (здесь через вызов и удвоение %%)

person Community    schedule 04.12.2018
comment
Спасибо за исправление, похоже, этот for /F "delims=" %%a in ('findstr/r/c:secret secret_file.txt') do echo hi работает, потому что нет пробелов, кроме того, который требуется для указания файла, верно? Это тоже не решение? - person Patches; 04.12.2018
comment
Nvm Я ответил сам себе, скрипт, который вы разместили, работает и с findstr, содержащим пробелы, которые в этом случае должны быть каким-то образом экранированы. Теперь все ясно, еще раз спасибо. - person Patches; 04.12.2018
comment
Если вы переключите tokens=*, который по-прежнему использует delims=space по умолчанию, на "delims=", весь проанализированный контент также будет в %%a, но на этот раз с начальными пробелами. - person ; 04.12.2018