Invoke-команда не возвращает никакого значения, когда get-itemproperty возвращает null - PullRequest
1 голос
/ 21 февраля 2020

Я пытаюсь использовать встроенные возможности параллельной обработки Invoke-Command, чтобы я мог быстро сканировать сотни машин для установки Office 365 (обнаруживая расхождения в отчетах SCCM). Однако, когда Get-ItemProperty не может найти раздел реестра, я не уверен, как зафиксировать тот факт, что на машине нет O365.

Например;

<some list of machines>.txt contains
computer1
computer2
computer3

$Computers = Get-Content .\<some list of machines>.txt
Invoke-Command -ComputerName $Computer -ScriptBlock {(Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\O365ProPlusRetail*)} -ErrorAction SilentlyContinue -ErrorVariable Problem | select pscomputername, DisplayName, DisplayVersion

... работает очень быстро и перечисляет все машины с O365 и версией. Замечательно. Но отсутствует каждая машина, на которой НЕ установлен O365. То есть, если «computer2» в приведенном выше списке не имеет O365, вывод показывает:

PSComputerName DisplayName                          DisplayVersion
-------------- -----------                          --------------
computer1      Microsoft Office 365 ProPlus - en-us 16.0.9226.2114
computer3      Microsoft Office 365 ProPlus - en-us 16.0.9226.2114

Любые идеи о том, как я могу сохранить параллельную обработку и получить вывод, подобный следующему?

PSComputerName DisplayName                          DisplayVersion
-------------- -----------                          --------------
computer1      Microsoft Office 365 ProPlus - en-us 16.0.9226.2114
computer2
computer3      Microsoft Office 365 ProPlus - en-us 16.0.9226.2114

1 Ответ

0 голосов
/ 21 февраля 2020

Измените ваш блок скрипта так, чтобы он возвращал фиктивный объект , который сигнализирует, когда информация недоступна:

Invoke-Command -ComputerName $Computer -ScriptBlock {
    $result = Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\O365ProPlusRetail* 
    if (-not $result) { [pscustomobject] @{} } else { $result }
  } -ErrorAction SilentlyContinue -ErrorVariable Problem | 
    Select-Object pscomputername, DisplayName, DisplayVersion

[pscustomobject] @{} создает пользовательский объект без свойств, к которым удаленное взаимодействие инфраструктура автоматически добавляет свойство .PSComputerName (среди прочего) при локальной десериализации; Select-Object затем неявно добавит пустые свойства .DisplayName и .DisplayVersion.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...