Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理如何将FINDSTR结果设置为变量并禁用FINDSTR打印到控制台_Batch File - Fatal编程技术网

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

Batch file 批处理如何将FINDSTR结果设置为变量并禁用FINDSTR打印到控制台,batch-file,Batch File,我的批处理程序 FINDSTR /C:"Result Comparison failure" %tmp_result_file% 我想执行以下操作,将上述命令的结果设置为变量。 如果找到,将第一行设置为Variable或将所有找到的行设置为Variable对我来说是可以的 此外,上面的命令将打印findstr命令,以控制台甚至@echo off。是否有任何方法禁用打印 非常感谢 作为脚本的一部分,我要做的是在sourcefile中的每一行上运行命令,并将运行结果放入tmp文件中,然后使

我的批处理程序

FINDSTR  /C:"Result Comparison failure"  %tmp_result_file% 
我想执行以下操作,将上述命令的结果设置为变量。 如果找到,将第一行设置为Variable或将所有找到的行设置为Variable对我来说是可以的

此外,上面的命令将打印findstr命令,以控制台甚至@echo off。是否有任何方法禁用打印

非常感谢


作为脚本的一部分,我要做的是在sourcefile中的每一行上运行命令,并将运行结果放入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
)
很奇怪,结果是:

xx Resultxxx xx xx 结果XXX xx 背景是我在
%source\u file%
中有两个项目,因此该文件将运行两次。
对于第一个,FINDSTR找不到任何内容,因此打印
xxx


对于第二个,它在findstr中找到一个,但只打印“
结果
”而不是“
结果比较失败
”,并且在结果中在它之前打印xx。很奇怪

检查FOR/F命令

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

第一个问题是,您只需从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。如果你想阻止第二次,你需要使用一些额外的逻辑。例如,设置一个变量,然后检查它。警告,在循环中设置变量需要启用延迟扩展并使用!xx!!语法(有关详细说明,请参见帮助集)


键入
以获取/?
查看所有选项。delims选项似乎与此相关。我试图为你指出正确的方向,而不是为你解决整个问题。你可能想要
for/f“delims=“%%I in(…
@RaymondChen那么你怎么能期望得到答案的复选标记呢?@Jamie答案是用于/f。最初提出的问题非常广泛,基本上是一个问题“按程序为我编写”,这是不应该的。@RaymondChen很公平,我看到的问题缺乏我原本期望的上下文。+1,但是为什么不直接比较
%%I
的值呢?就像这样(在内部循环的主体中):
如果“%%I”==”(ECHO xx)ELSE ECHO%%i
。是的,你是对的,这是一种可能性。我只是重复使用了处理多个查找结果的代码。tokens=*在%%i之前,不是吗?出现语法错误
“tokens=*”此时是意外的。
在第一个给定的
for/F
命令上。
“tokens”=*“
应该放在
%%i
之前。非常有用,谢谢。
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
)