我正尝试使用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
答案 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
属性。