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

时间:2018-12-04 13:31:11

标签: batch-file for-loop cmd 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,我的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一词。 我已经准备好提供任何详细信息,甚至可以编辑问题以使其更容易被看到 被微软抛弃的批处理脚本编写者。

1 个答案:

答案 0 :(得分: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";

(在代码块中)变量在解析时被扩展,
需要延迟的扩展(在此处通过致电并加倍了%%)