批量解析 systeminfo 中的知识库

Parsing KBs from systeminfo in batch

问题: 什么方法可以在 Windows systeminfo 命令报告中仅解析出修补程序 KB 条目。

背景: 我有许多 windows 系统需要从中获取已安装的 KB 列表。我无法在系统上安装任何软件,所以我决定使用批处理文件。

我想要一个 KB 列表作为输出,保存到文件“.txt”

我目前的方法: 到目前为止,我可以从 systeminfo 获取完整列表,并将整个输出放入一个以设备的主机名和日期命名的文本文件中,并将其粘贴在名为 Systeminfo Saves 的目录中。这对我来说效果很好,但我真的只对 KB 感兴趣,我希望使用该输出将其与经过验证的 KB 列表进行比较,以便我可以获得需要安装的 KB 列表。

我一直在使用 for 语句、标记和定界符来将列表缩小到 KB 文件,但没有成功。

这是我当前的代码:

@echo off
REM Get date and host and set it to sFileName
REM -----------------------------------------
setlocal enabledelayedexpansion
set ssDate=%date%
set sHost=%computername%
set sDate=!ssDate:/=-!
REM Remove the day of the week
set sDate=%sDate:~-10%
set sFileName=%sHost% %sDate%.txt
REM -----------------------------------------


REM - Save system info to hostname and date -
REM -----------------------------------------
systeminfo > "Systeminfo Saves/%sFileName%"
REM
REM PUT FOR STATEMENT HERE FOR OUTPUT OF JUST KBs
REM -----------------------------------------

我无法完成的下一步是将安装的 KB 解析为一个文件。

For 语句让我陷入了循环(温和的双关语)。我试过这个:

REM OUTPUT a list of KBs
SET count=1
set lookieloo = "]: KB"
FOR /F "tokens=* USEBACKQ" %%F IN (`systeminfo`) DO (
  SET var!count!=%%F
  SET /a count=!count!+1
  REM See if "]: KB" is in the resultant string
  if not x%%F:"]: KB"=%==x%%F echo %%F >> "Systeminfo Saves/%sFileName%"
)

我将部分回答了我的问题的其他 Stack Overflow 答案中我不完全理解的答案拼接在一起。

最后一次保存到文件我很确定不会工作 . "]: KB" 根本不起作用。我尝试使用变量 lookieloo 来使该语句起作用。我没有收到错误,但我也没有收到 KB 列表。

所以,问题是:使用 systeminfo 命令导出系统上安装的 KB 的文本文件的批处理程序是什么样的?

根据 LotPings 的评论,我能够整理出一个完整的程序,仅使用批处理即可提取已安装的 KB。

@setlocal enableextensions enabledelayedexpansion
@echo off
REM Get date and host and set it to sFileName
REM -----------------------------------------
set ssDate=%date%
set sHost=%computername%

REM Get the directory and make it if it doesn't exist
set sDir=Systeminfo Saves
if not exist "%sDir%\" mkdir "%sDir%\"
set sDate=!ssDate:/=-!

REM Remove the day of the week
set sDate=%sDate:~-10%

REM Compile the full file name with directory
set sFileName=%sDir%^\%sHost% %sDate%.txt
REM -----------------------------------------
echo %sFileName%

REM -- Extract KB information and save to file --
(For /f "tokens=2delims=: " %%A in ('systeminfo^|findstr "\[[0-9][0-9]*\]:.KB[0-
9]*"') Do @Echo:%%A)>"%sFileName%"
REM ---------------------------------------------

加载和解析 SystemInfo 是一项耗时的操作,虽然确定更新可能需要一段时间,但使用 WMI 可能是一种更快的方法。

这是一个使用 WMIC:

的替代方案
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "sDir=WMIC Saves"
Set "sDate=%DATE:/=-%"
Set "sDate=%sDate:~-10%"
Set "sFileName=%sDir%\%COMPUTERNAME% %sDate%.txt"

If Not Exist "%sDir%\" MD "%sDir%" 2>Nul || Exit /B

(For /F "EOL=H Tokens=*" %%A In ('"WMIC QFE Get HotFixID|Sort"'
) Do For /F "Tokens=*" %%B In ("%%A") Do Echo=%%B)>"%sFileName%"