我有一个批处理文件,它在命令行中运行命令并在输出中搜索关键字。然后输出带有关键字的行之前的行。
例如:搜索关键字
上一行
关键字
result: PREVIOUS LINE
代码如下
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行我可以搜索。
您可以很容易地以一种非常简单的方式存储搜索到的前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行来更改存储的行数…
可以使用驱动程序日期和版本来识别已安装驱动程序的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%System32pnputil.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%System32pnputil.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
注意:具有一个或多个!
的行不会被此代码处理,因为永久启用的延迟环境变量扩展导致将分配给循环变量I
的字符串中的感叹号解释为延迟扩展的环境变量引用的开始/结束。
根据要处理的数据,还有许多其他可能的解决方案。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并完整而仔细地阅读显示的每个命令的帮助页。
echo /?
endlocal /?
for /?
if /?
pnputil -?
或pnputil /?
set /?
setlocal /?