在命令行输出中搜索关键字并显示上一行的批处理文件(x5)

Posted

技术标签:

【中文标题】在命令行输出中搜索关键字并显示上一行的批处理文件(x5)【英文标题】:Batch file that searches cmdline output for keyword and displays the previous line(x5) 【发布时间】:2021-10-05 07:14:33 【问题描述】:

我有一个批处理文件,它在命令行中运行命令并在输出中搜索关键字。然后输出带有关键字的行的前一行。

例如:搜索关键字

上一行

关键字

结果:上一行

代码如下

set Output="pnputil -e"
FOR /F "eol=. tokens=*" %%a IN ( '%Output%' ) DO (
    set line=%%a
    set ourline=!line:KEYWORD=!
    if not !line!==!ourline! (
        SET Output=!prev_line!
    )
    SET prev_line=%%a
)
echo Installed OEM file found as: !Output!

我想复制这个,但我想要的行是关键字之前的 5 行。我想要的输出后面是 4 行随机信息,后面只有一个常量关键字 5 行,我可以搜索。

【问题讨论】:

【参考方案1】:

可以使用驱动程序日期和版本来识别已安装驱动程序的oem*.inf 文件。下面的批处理文件搜索驱动程序日期为06/12/2020,驱动程序版本为16.51.39.165 的驱动程序。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "FileName="
for /F "tokens=1,2* delims=: " %%I in ('%SystemRoot%\System32\pnputil.exe -e 2^>nul') do (
    if "%%I %%J" == "Published name" (
        set "FileName=%%K"
    ) else if "%%I %%J" == "Driver date" (
        set "DriverDateVersion=%%K"
        setlocal EnableDelayedExpansion
        if not "!DriverDateVersion:06/12/2020 16.51.39.165=!" == "!DriverDateVersion!" echo Installed OEM file found as: !FileName!
        endlocal
    )
)
endlocal

但当然也可以在循环中记住最后四行,并检查每一行的字符串以找到类似Hardware Compatibility 的字符串,如下面的批处理文件所做的那样。

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "Line1=?"
set "Line2=?"
set "Line3=?"
set "Line4=?"
for /F delims^=^ eol^= %%I in ('%SystemRoot%\System32\pnputil.exe -e 2^>nul') do (
    set "Line1=!Line2!"
    set "Line2=!Line3!"
    set "Line3=!Line4!"
    set "Line4=!CurrentLine!"
    set "CurrentLine=%%I"
    if not "!CurrentLine:Hardware Compatibility=!" == "!CurrentLine!" echo(!Line1!
)
endlocal

注意:具有一个或多个! 的行不会被此代码更正处理,因为永久启用延迟环境变量扩展会导致解释分配给循环变量@ 的字符串中的感叹号987654329@ 作为延迟扩展环境变量引用的开始/结束。

根据要处理的数据,还有许多其他可能的解决方案。

要了解所使用的命令及其工作原理,请打开command prompt 窗口,在那里执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

echo /? endlocal /? for /? if /? pnputil -?pnputil /? set /? setlocal /?

【讨论】:

【参考方案2】:

您可以通过一种非常简单的方式轻松存储搜索到的前 5 行:

@echo off
setlocal EnableDelayedExpansion

for /F "eol=. delims=" %%a in ('pnputil -e') do (
   set "i=5"
   for /L %%n in (4,-1,1) do set "line!i!=!line%%n!" & set "i=%%n"
   set "line1=%%a"
   if not "!line1!" == "!line1:KEYWORD=!" set "Output=!line5!"
)

echo Result: %Output%

您可以通过仅更改 2 行来更改存储的行数...

【讨论】:

以上是关于在命令行输出中搜索关键字并显示上一行的批处理文件(x5)的主要内容,如果未能解决你的问题,请参考以下文章

linux查找并输出特定行和它的前一行且在后面再输出一个空白行的命令

cmd脚本,截取某个命令输出结果的某一行之后重新输出至cmd页面,输出且仅输出那一行

文本处理工具

在批处理脚本中使用命令行输出

grep 命令使用

Linux:从文件中搜索关键字并显示行数(cat,grep函数)