Центр обновления Windows через Powershell IndexOutOfRangeException

#windows #powershell #windows-update #wuapi

#Windows #powershell #центр обновления Windows #wuapi

Вопрос:

Я пытаюсь установить обновления Windows через PowerShell, используя COM-объекты из WUApi.

Вот код, который я получил до сих пор.

 $updateSession = New-Object -com Microsoft.update.Session
$updateSearcher = $UpdateSession.CreateUpdateSearcher()
$updateResult = $updateSearcher.Search("IsInstalled=0 and Type='Software'");
$needsRestart = $false
foreach($update in $updateResult.Updates) {
    $needsRestart = $needsRestart -or $update.InstallationBehavior.RebootBehavior -ne 0
}
$updateDownloader = $UpdateSession.CreateUpdateDownloader()
$updateDownloader.Updates = $updateResult.Updates
$downloadResult = $updateDownloader.Download()
  

Когда я запускаю этот код, я получаю IndexOutOfRangeException .

 Index was outside the bounds of the array.
At C:UsersMyUserDocumentsUpdate-Windows2.ps1:9 char:1
  $updateDownloader.Updates = $updateResult.Updates
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      CategoryInfo          : OperationStopped: (:) [], IndexOutOfRangeException
      FullyQualifiedErrorId : System.IndexOutOfRangeException
  

Я проверил и перепроверил, и, похоже, я не могу найти, где проблемы. Я пробовал аналогичную логику с кодом на C #, и, похоже, он может назначить Updates переменную нормально без каких-либо проблем.

Есть идеи, чего мне здесь не хватает? Заранее спасибо.

Комментарии:

1. Невозможно дублировать. Для меня это сработало нормально.

2. Я попробовал еще раз сегодня, и это больше не происходит. Я думаю, что, возможно, перезагрузка компьютера устранила эту проблему. Думаю, это могло быть вызвано утечкой памяти COM-объекта. В любом случае спасибо за ответ.

Ответ №1:

Не могу воспроизвести, но я уверен, что «$updateResult .Обновления» равно $ null (= нет доступных обновлений) Не могли бы вы проверить?

Если это так, добавьте условие if ($ null в левой части при использовании с коллекциями!)

 if ($null -ne $updateResult.Updates) {
    $updateDownloader.Updates = $updateResult.Updates
    $downloadResult = $updateDownloader.Download()
}
  

Почему $null слева? (независимо от версии PS):
https://learn.microsoft.com/en-us/powershell/scripting/learn/deep-dives/everything-about-null?view=powershell-7.1#checking-for-null

Комментарии:

1. Спасибо за ответ. Думаю, перезагрузка компьютера устранила эту проблему для меня. Может быть какая-то утечка памяти COM, которая могла вызвать это?