Batch file 使用for循环逐行读取文件,并在DOS中匹配所需的键内容
我想逐行读取文件,并将该行与数据中的用户密钥进行比较。 如果输入的数据至少与整行中的一个字匹配,my 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
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 ...