不足为奇的是,官方文档对理解如何 命令是否处理命令的结果而不是文件列表,为什么它甚至都不被称为“ 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一词。 我已经准备好提供任何详细信息,甚至可以编辑问题以使其更容易被看到 被微软抛弃的批处理脚本编写者。
答案 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";
(在代码块中)变量在解析时被扩展,
需要延迟的扩展(在此处通过致电并加倍了%%)