如何parsingwusa命令的evtx日志输出?

了解了如何脚本安装.msu更新

$filename = "C:\temp\log\WUInstall_" + $timer + ".evtx" Start-Process -FilePath wusa -ArgumentList "\\fs1\software\WS2012R2\windows8.1-kb4041693-x64_31e473824b705bf05f3befc423d39fa0c6d0fb49.msu /quiet /norestart /log:$filename" -Wait 

在Powershell中使用wusa是因为这是避免更新后机器重新启动的唯一方法 – 因为我需要等待这个完成并运行更多的命令,然后再发出手动重新启动( /norestart需要/quiet ) 。 无法将安装结果logging为纯文本格式,仅限于.evtx

我们只是说已经安装了更新(可能是一个已经打过补丁的操作系统映像,不能控制这个),我运行脚本。 它只是运行,没有错误。 在没有/quiet /norestart情况下执行时,最终会打印出“<..>已经安装在这台电脑上”。 此外,在.evtx日志中还有几行显示安装过程的状态,包括“InstallWorker.01090:更新已安装”。 但我不知道如何parsing这个日志。 我只能parsing一个纯文本日志。

有没有办法parsing.evtx日志? 所以我可以把一些逻辑在我的脚本来检查状态(更新安装好或不),并决定一个行动? (移动到脚本中的下一步或退出时出错)

或者更好的解决scheme来解决这个在Powershell 5.1? 应该能够将其应用于WS 2012至2016年。

首先,我非常肯定,由此生成的日志文件不会是除ASCII格式日志文件之外的其他任何内容。 命名它.evtx只会令人困惑。

为了查找已知行而不是parsing日志文件,为命令成功或失败构build的函数是return codeexit code 。 这应该让你开始:

 $pinfo = New-Object System.Diagnostics.ProcessStartInfo $pinfo.FileName = $commandPath $pinfo.RedirectStandardError = $true $pinfo.RedirectStandardOutput = $true $pinfo.UseShellExecute = $false $pinfo.Arguments = $commandArguments $p = New-Object System.Diagnostics.Process $p.StartInfo = $pinfo $p.Start() | Out-Null [pscustomobject]@{ commandTitle = $commandTitle stdout = $p.StandardOutput.ReadToEnd() stderr = $p.StandardError.ReadToEnd() ExitCode = $p.ExitCode } $p.WaitForExit() 

获得返回码后,这可能是有帮助的:

https://support.microsoft.com/en-us/help/938205/windows-update-error-code-list

 Get-WinEvent -Path $PathToFile 

这应该工作,假设它真的是一个.evtx文件。