我可以知道下面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"
...谢谢
答案 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
直接完成工作。