以下2个findstr代码有什么区别?

时间:2014-06-10 08:45:31

标签: batch-file findstr

我可以知道下面2个findstr代码之间有什么区别吗?

第一种情况:

findstr /m 0632 log_network.txt
if %errorlevel%==0 (
    echo FOUND
) else (
    echo NOT FOUND
)

第二种情况:

set entire_line="0632"
echo %entire_line% | findstr /m log_network.txt
if %errorlevel%==0 (
    echo FOUND
) else (
    echo NOT FOUND
)

第一个案例返回“FOUND”,第二个案例返回“NOT FOUND”...... 此外,我总是看到人们喜欢使用:

echo %something% | findstr /m filename.txt > null

但我不明白为什么他们这样写...

log_network.txt内容:

Set_Param_10A "TRUE" "xnetwork.exist.5846"
Set_Param_10A "TRUE" "xnetwork.exist.7425"
Set_Param_10A "TRUE" "xnetwork.exist.1420"
Set_Param_10A "TRUE" "xnetwork.exist.0632"
Set_Param_10A "TRUE" "xnetwork.exist.1112"
Set_Param_10A "TRUE" "xnetwork.exist.8524"
Set_Param_10A "TRUE" "xnetwork.exist.3675"
Set_Param_10A "TRUE" "xnetwork.exist.3344"
Set_Param_10A "TRUE" "xnetwork.exist.1276"
Set_Param_10A "TRUE" "xnetwork.exist.4796"
Set_Param_10A "TRUE" "xnetwork.exist.3349"
Set_Param_10A "TRUE" "xnetwork.exist.0048"

...谢谢

1 个答案:

答案 0 :(得分:0)

第一种情况是将字符串0632搜索到文件log_network.txt中,如果在文件中找到它,则文件名将回显到控制台(/m开关)。如果找到,则errorlevel将为0,如果未找到,则errorlevel将为1.

第二种情况是在从stdin接收的数据中搜索字符串log_network.txt,即"0632"。这可能是对于findtr工作方式的错误或误解。

要“模仿”第一个代码的功能,但使用第二个代码的结构,它应该是类似的

set "entire_line=0632"
echo %entire_line%| findstr /g:/ /m log_network.txt

也就是说,首先从搜索到的值中删除引号(在原始代码中它们包含在值中),然后让findstr从stdin(/g:/)获取搜索字符串,根据内容检查它们如果找到任何重合,则输出文件log_network.txt并输出文件名(/m

无论如何,第一个构造的效率要高得多。创建管道涉及更多的CPU使用,而不仅仅是让findstr直接完成工作。