【问题标题】:How to output multiple lines from a FINDSTR to a variable如何将多行从 FINDSTR 输出到变量
【发布时间】:2018-12-04 13:31:11
【问题描述】:

毫不奇怪,官方文档在理解如何 该命令是否处理命令的结果而不是文件列表,为什么它甚至不被称为“FOR”。是的,我已经知道了 stackoverflow 充满了类似的问题,但很明显,因为批处理脚本受很多因素的影响 “破”的因素,即使作为一个非批处理经验的程序员,也很难不迷失在 数以千计的例外和注意事项可能会影响结果。 除了从可能的最佳答案中学习之外,我的目标是制定一个足够通用的问题 代表问题可能是最常见的任务,包括 FINDSTR 命令:

问题:

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

我可以制作的最“通用”(批量 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 命令,我可以像这样输出每个“秘密”行:

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

但是如果没有进一步解析,这个结果就没有用了,对吧?我可以在任何文本阅读器/编辑器上使用 ctrl-F 对于这件事,无论如何,假设我现在想输出每一行 ONE AT THE TIME,以便我可以计算它,因为 例如,将每个秘密保存到一个变量中,然后以某种方式使用该变量 (如何做并不重要,我们可以简单地回显它)。

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

【问题讨论】:

  • 由于您回显了一个常量文本,因此不会输出任何已处理的行内容,仅输出您的文本的 3 倍。
  • 没关系,因为即使是常量文本也不会被打印出来,如果我的目标是让代码正常工作,我会为 /F "delims=" %%a 编写类似 [code] 的东西in ('findstr /c:secret secret_file.txt') do echo %%a [/code],这很完美,但我想了解为什么问题中提到的代码不起作用。我应该逃避什么吗?

标签: batch-file for-loop cmd findstr


【解决方案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";

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

【讨论】:

  • 感谢您的更正,所以看起来这个for /F "delims=" %%a in ('findstr/r/c:secret secret_file.txt') do echo hi 有效,因为除了指定文件所需的空格之外没有其他空格,对吗?这不也是一个解决方案吗?
  • Nvm 我回答我自己,您发布的脚本也可以与包含空格的 findstr 一起使用,在这种情况下应该以某种方式转义。现在很清楚了,再次感谢。
  • 如果您将仍使用默认 delims=space 的 tokens=* 切换到 "delims=",所有已解析的内容也将在 %%a 中,但这次 带有 前导空格.
猜你喜欢
  • 1970-01-01
  • 2018-10-25
  • 2010-10-11
  • 2023-03-05
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多