如何将多行从 FINDSTR 输出到变量

How to output multiple lines from a FINDSTR to a variable

毫不奇怪,官方文档并不能真正帮助理解如何 命令是否处理命令的结果而不是文件列表,为什么它甚至被称为 'FOR'。是的,我已经知道 Whosebug 充满了类似的问题,但看起来很明显,因为批处理脚本受到如此多的影响 "breaking" 因素,即使是没有批处理经验的程序员,也很难不迷失在 数以千计的例外和禁忌可能会影响结果。 我的objective,除了从可能的最佳答案中学习之外,是制定一个足够通用的问题 表示这可能是最常见的任务,包括 FINDSTR 命令:

问题:

如何以允许我一次计算每个结果行的方式获取 FINDSTR 的输出 可能在循环内?

我能做的最'generic'(如果你明白我的意思的话,批量 bs-proof)例子如下:

假设这是 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 命令我可以像这样输出每个 "secret" 行:

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

但是如果不进一步解析,这个结果就没有用了,对吧?我可以在任何文本上使用 ctrl-F reader/editor 就此而言,无论如何,假设我现在想一次输出每一行,以便我可以计算它,因为 例如,将每个秘密保存到一个变量中,然后以某种方式使用该变量 (怎么做并不重要,我们可以回显它以保持简单)。

现在,每个人都同意这样一个事实,即对于此类任务,需要一个 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 命令不兼容的格式,不像我可以检查的那样,因为源已关闭并且 文档甚至懒得定义字符串这个词。 我已准备好提供任何详细信息,甚至可以编辑问题以让想成为的人更容易看到 那里有微软遗弃的批处理脚本程序。

使用 "tokens=*" 去除前导空格此批次使用计数器创建(伪)数组 secret[]

:: Q:\Test18\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";

由于(代码块)中的变量在解析时被扩展,
延迟扩展是必需的(这里是通过调用和加倍 %%)