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

Ben*_* Xu 11 batch-file

我的批处理程序

FINDSTR  /C:"Result Comparison failure"  %tmp_result_file% 
Run Code Online (Sandbox Code Playgroud)

我想做folloiwng,将上面命令的结果设置为变量.如果找到,将第一行设置为varible或将所有找到的行设置为varible对我来说没问题.

上面的命令也会打开findstr命令来控制甚至@echo.有什么方法可以禁用打印.

非常感谢


我的脚本的一部分,我所做的是在源文件的每一行上运行命令,并将运行结果放入tmp文件,然后使用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
)
Run Code Online (Sandbox Code Playgroud)

很奇怪,结果是:

    xx
    Resultxxx
    xx

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

PA.*_*PA. 5

第一个问题是因为您只是从FOR获取了第一个令牌。为了解决这个问题,您有两种解决方案,一种是回显找到字符串的整行。

for /f %%i "tokens=*" in ('FINDSTR /C:"Result Comparison Failure" %tmp_result_file%') do echo %%i
Run Code Online (Sandbox Code Playgroud)

或回显找到的三个标记

for /f %%i in ('FINDSTR /C:"Result Comparison Failure" %tmp_result_file%') do echo %%i %%j %%k
Run Code Online (Sandbox Code Playgroud)

第二个问题,xx回响了两次,是因为您运行了两次命令。第一个xx是第一次运行的,第二个是第二次运行的。如果要防止出现第二种情况,则需要使用一些其他逻辑。例如,设置一个变量然后检查它。警告,在循环中设置变量需要启用延迟扩展并使用!xx !!语法(有关详细说明,请参见HELP SET)

setlocal enabledelayedexpansion
...
set result=
for /f %%i "tokens=*" in ('FINDSTR /C:"Result Comparison Failure" %tmp_result_file%') do (
  set result=%%i
)
if "!result!"=="" ( 
  echo !result!
) else (
  echo xx
)
Run Code Online (Sandbox Code Playgroud)