批处理如何将FINDSTR的结果设置为变量并禁用findstr在控制台上打印

12
我的批处理程序
FINDSTR  /C:"Result Comparison failure"  %tmp_result_file% 
我想要做以下事情,将上述命令的结果设置为变量。如果找到了,则将第一行设置为变量或将所有找到的行设置为变量都可以。
另外,即使使用@echo off,上述命令也会将findstr命令打印到控制台。是否有任何方法可以禁用该打印?
非常感谢。
我的脚本部分内容是,在源文件的每一行上运行命令并将运行结果放入临时文件中,然后使用find str查找失败的字符串以检查运行结果。
for /f  %%a in (%source_file%) do (
    echo  run %%a >> %output_file%
    call  %run_script_command% %%a > %tmp_result_file% 2>&1
    ::notepad %tmp_result_file%
      for /f %%i in ('FINDSTR /C:"Result Comparison failure"  %tmp_result_file%') do  echo %%ixxx
    echo xx
)

非常奇怪,结果是:

    xx
    Resultxxx
    xx

背景是我在%source_file%中有两个项目,因此运行了两次。
对于第一个项目,FINDSTR 找不到任何东西,所以打印出 xxx
对于第二个项目,它在 findstr 中找到了一个,但只打印了 "Result" 而不是 "Result Comparison failure",而且在结果中的 xx 在它之前打印。非常奇怪!

2个回答

8
第一个问题是因为你只从FOR里取了第一个标记。要解决这个问题,你有两种解决方案,一种是回显找到字符串的完整行...
for /f "tokens=*" %%i in ('FINDSTR /C:"Result Comparison Failure" %tmp_result_file%') do echo %%i

或者输出找到的三个标记。
for /f %%i in ('FINDSTR /C:"Result Comparison Failure" %tmp_result_file%') do echo %%i %%j %%k

第二个问题是,xx重复出现两次是因为您运行了两次该命令。第一个xx是第一次运行的结果,第二个xx是第二次运行的结果。如果您想避免第二个xx的出现,您需要使用一些额外的逻辑。例如,设置一个变量然后进行检查。警告:在循环中设置变量需要启用延迟扩展并使用!xx!语法(请参阅HELP SET以获取详细说明)。
setlocal enabledelayedexpansion
...
set result=
for /f "tokens=*" %%i in ('FINDSTR /C:"Result Comparison Failure" %tmp_result_file%') do (
  set result=%%i
)
if "!result!"=="" ( 
  echo !result!
) else (
  echo xx
)

1
+1,但为什么不直接比较%%i的值呢?像这样(在内部循环体中):IF "%%i" == "" (ECHO xx) ELSE ECHO %%i - Andriy M
是的,你说得对,那是一个可能性。我只是重复使用了处理多个查找结果的代码。 - PA.
1
tokens=* 应该放在 %%i 之前,对吗? - Dan
在第一个给定的 for /F 命令中存在语法错误 "tokens= *" 在此时是意外的。应该将 "tokens= *" 放在 %%i 之前。 - zhenguoli

2

Check out the FOR /F command.

for /f %i in ('FINDSTR  /C:"Result Comparison failure"  %tmp_result_file%') do ...

2
输入“for /?”以查看所有选项。在这里,delims选项似乎很相关。我试图指引您朝正确的方向前进,而不是为您解决整个问题。 - Raymond Chen
你可能想要使用 for /f "delims=" %%i in (... - Gabe
1
@RaymondChen 那么你如何期望获得“答案”的勾选标记呢? - Jamie
@Jamie 答案是使用 FOR /F。最初提出的问题非常广泛,基本上是“为我编写程序”,而 SO 并不打算这样做。 - Raymond Chen
@RaymondChen 好的,我认为这个问题缺乏我最初期望的上下文。 - Jamie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接