弄清楚了如何编写脚本安装密歇根州立大学更新。
$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,因为这是避免更新后机器重启的唯一方法——因为我需要等待这个完成并运行几个命令,然后再发出手动重启(也/norestart
需要/quiet
)。无法将安装结果记录为明文格式,这是.evtx仅有的。
假设更新已经安装(可能是已经修补的操作系统映像,无法控制这一点),然后我运行脚本。它只是运行,没有错误。如果不执行/quiet /norestart
它,最终会打印“<..> 已安装在这台计算机上。”此外,在.evtx日志中有几行显示安装过程的状态,包括“InstallWorker.01090:更新已安装”。但我不知道如何解析此日志。我只能解析纯文本日志。
有没有办法解析.evtx日志?这样我就可以把一些逻辑放到我的脚本中来检查状态(更新安装是否正常)并决定采取什么行动?(移动到脚本中的下一步或因错误退出)
或者在 Powershell 5.1 中解决此问题的更好解决方案?应该能够将其应用于 WS 2012 到 2016。
答案1
Get-WinEvent -Path $PathToFile
假设它确实是一个 .evtx 文件,那么应该可以工作。
答案2
首先,我很确定由此生成的日志文件不会是除 ASCII 格式之外的任何其他文件。命名.evtx
只会让人感到困惑。
与解析日志文件来查找已知行不同,构建用于判断命令是否成功或失败的函数是 or return code
。exit 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