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