Batch file 使用for循环逐行读取文件,并在DOS中匹配所需的键内容

Batch file 使用for循环逐行读取文件,并在DOS中匹配所需的键内容,batch-file,for-loop,findstr,Batch File,For Loop,Findstr,我想逐行读取文件,并将该行与数据中的用户密钥进行比较。 如果输入的数据至少与整行中的一个字匹配,my dos窗口将输出该行 有人能指导我完成这段代码吗 SET user_key_in_data=abc FOR /F "delims=" %%G IN (%~dp0database.txt) DO (CALL :match_function) :match_function 这是我的尝试代码,但它不能按我的要求工作: @echo off SETLOCAL EnableDelayedExpans

我想逐行读取文件,并将该行与数据中的用户密钥进行比较。 如果输入的数据至少与整行中的一个字匹配,my dos窗口将输出该行

有人能指导我完成这段代码吗

SET user_key_in_data=abc

FOR /F "delims=" %%G IN (%~dp0database.txt) DO (CALL :match_function)

:match_function
这是我的尝试代码,但它不能按我的要求工作:

@echo off
SETLOCAL EnableDelayedExpansion

SET matchpattern=NETWORK.*ISSUE

FOR /F "delims=" %%G IN (database.txt) DO (SET currentline=%%G & CALL :match_function)
pause
GOTO:eof

:match_function
    findstr /I /R /C %matchpattern% %currentline%
    if %errorlevel%==0 (
        echo %currentline%
    )
GOTO:eof
Stephan回复后更新:

为什么当匹配条件不满足时,DOS仍会打印出不必要的输出,例如忽略FINDSTR:/C

下面是代码+文本文件+dos输出

代码:

log_network.txt文件:

设置参数为真xnetwork.exist.5846

设置参数为真xnetwork.exist.7425设置参数为真 xnetwork.exist.1420设置参数为真xnetwork.exist.0632 设置参数为真xnetwork.exist.1112设置参数为真 xnetwork.exist.8524设置参数10A真实xnetwork.exist.3675 设置参数为真xnetwork.exist.3344设置参数为真 xnetwork.exist.1276设置参数10A真实xnetwork.exist.4796 设置参数为真xnetwork.exist.3349设置参数为真 xnetwork.exist.0048

和Dos输出:

FINDSTR:/C已忽略

FINDSTR:/C已忽略

FINDSTR:/C已忽略

FINDSTR:/C已忽略

设置参数为真xnetwirk.exist.0632

FINDSTR:/C已忽略

FINDSTR:/C已忽略

FINDSTR:/C已忽略

FINDSTR:/C已忽略

FINDSTR:/C已忽略

FINDSTR:/C已忽略

FINDSTR:/C已忽略


FINDSTR:/C已忽略

您不需要%currentline%。只需将该行作为参数传递给您的子函数:

... do call match_function %%G
在子函数内部,您可以将其用作%*所有参数

:match_function
echo %* | findstr /I /R /C %"matchpattern%" >nul
if ...
@回音 SETLOCAL 设置matchpattern=网络。*问题 对于q2413524.txt中的/f delims=%%a,请设置currentline=%%a&调用:match_函数 回音============= FINDSTR/i/r/c:%matchpattern%q24133524.txt 后藤:EOF :匹配函数 ECHO%currentline%| findstr/I/R/C:%matchpattern% 如果%errorlevel%==0 回波%currentline% 后藤:eof 我使用了一个名为q24133524.txt的文件,其中包含用于测试的数据

这显示了过程修改版本的结果。findstr找到字符串并输出它,然后if errorlevel。。。再次输出它


第二种方法要简单得多…

我发现DO SET currentline=%%G和CALL:match_函数与DO CALL match_函数%%G的不同之处在于前者将直接输出整行,但您建议的方法将被分隔为空间组%1%2%3,依此类推,以便打印整行。。。因此,如果我使用echo%1 | findstr/I/R/C%matchpattern%>nul,它只会将第一组句子与匹配模式进行比较。。空格字符后的所有内容都将被忽略…易于解决:使用%*。对不起,我应该想到这一点。我想只有添加令牌=*Hmmm,@Stephan,你能帮我看看这篇文章中的问题吗?如果使用你的代码,将有多个网络问题检测到的行显示为输出…即使我删除了ECHO=============================FINDSTR/I/r/c:%matchpattern%q24133524.txt行,它仍将显示2行网络问题检测行,但在tet文件中只有1行网络问题检测行…我在您文章底部添加的最新代码将实现我的目标…谢谢…这正是您所描述的:findstr%user_key_in_data%%~dp0database。txt@Aacini,我只是想知道这会不会在不使用for循环的情况下逐行读取整个文件?同时,我的要求是只要部分文本匹配,那么整行就会打印出来…这就是为什么我选择使用for loop+findstr…虽然没有明确的记录方式,但命令:findstr string file执行以下操作:1-逐行读取文件,2-将每行与字符串进行比较,3-如果在该行的任何位置发现该字符串,则显示该行。如果这就是你想要做的,我看不出有任何理由不只是使用一个简单的findstr。。。
:match_function
echo %* | findstr /I /R /C %"matchpattern%" >nul
if ...