当get-itemproperty返回null时,调用命令不返回任何值

时间:2020-02-21 19:46:18

标签: powershell parallel-processing office365 sccm invoke-command

我正尝试使用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 :(得分:0)

修改您的脚本块,以返回虚拟对象,该对象会在信息不可用时发出信号:

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