Как вывести несколько строк из FINDSTR в переменную - PullRequest
0 голосов
/ 04 декабря 2018

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

1 Ответ

0 голосов
/ 04 декабря 2018

Использование "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";

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

...