Назад | Перейти на главную страницу

Как разобрать вывод журнала evtx команды wusa?

Разработал скрипт установки .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

С помощью Wusa с Powershell, так как это единственный способ избежать перезапуска компьютера после обновления - так как мне нужно дождаться завершения этого и запустить еще пару команд, прежде чем выполнять ручной перезапуск (/norestart требует /quiet также). Невозможно записать результат установки в текстовом формате, это .evtx только.

Скажем так, обновление уже установлено (это может быть уже пропатченный образ ОС, никакого контроля над этим), и я запускаю скрипт. Просто запускается, без ошибок. При исполнении без /quiet /norestart в конечном итоге он напечатает «<..> уже установлен на этом компьютере». Также в .evtx log есть несколько строк, которые показывают статус процесса установки, в том числе «InstallWorker.01090: Обновление уже установлено». Но я не знаю, как разбирать этот журнал. Я могу разбирать только обычный текстовый журнал.

Есть ли способ разобрать .evtx журнал ? чтобы я мог добавить в свой сценарий некоторую логику, чтобы проверить статус (обновление установлено нормально или нет) и принять решение о действии? (перейти к следующему шагу скрипта или выйти с ошибкой)

Или лучшее решение для решения этой проблемы в Powershell 5.1? Должна быть возможность применить его к WS с 2012 по 2016 год.

Во-первых, я почти уверен, что сгенерированный им файл журнала не будет ничем иным, как файлом журнала в формате ASCII. Называя это .evtx только сбивает с толку.

Вместо того, чтобы анализировать файл журнала для поиска известных строк, функция, которая создается для того, была ли команда выполнена успешно или неудачно, является 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

Get-WinEvent -Path $PathToFile

Это должно работать, если это действительно файл .evtx.