在命令行输出中搜索关键字并显示上一行的批处理文件(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查找并输出特定行和它的前一行且在后面再输出一个空白行的命令