当 get-itemproperty return null 时调用命令不 returning 任何值

Invoke-command not returning any value when get-itemproperty return null

我正在尝试使用 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 的机器。 IE。如果上面列表中的 "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

将您的脚本块修改为return一个虚拟对象,当信息不可用时发出信号:

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 属性。