PowerShell函数接收SMS_InstalledSoftware对象时数据丢失问题排查
解决PowerShell函数接收SMS_InstalledSoftware对象时的数据丢失问题
问题根源
Get-CimInstance获取的SMS_InstalledSoftware是CimInstance对象实例集合,而非字符串数组。当你把这些对象传入参数类型为string[]的函数时,PowerShell会强制将每个对象转换为字符串,结果只是输出对象的类型名称(比如Microsoft.Management.Infrastructure.CimInstance#root/SMS/site_XXX/SMS_InstalledSoftware),自然无法访问对象的属性(如Name、Version),导致输出为空。
正确解决方案
方法1:指定准确的参数类型
直接将函数参数类型设为CimInstance对象数组,完整类型名或简写均可:
function listSWInformation { param( # 完整类型名,更明确 [Microsoft.Management.Infrastructure.CimInstance[]]$Software # 或者简写形式,PowerShell能识别 # [CimInstance[]]$Software ) foreach ($item in $Software) { # 可直接访问SMS_InstalledSoftware的所有属性 Write-Host "软件名称: $($item.Name)" Write-Host "版本号: $($item.Version)" Write-Host "发布者: $($item.Publisher)`n" } }
方法2:不指定参数类型(快速场景)
让PowerShell自动推断参数类型,适合快速编写脚本:
function listSWInformation { param( $Software ) foreach ($item in $Software) { Write-Output "[$($item.Name)] - 版本: $($item.Version)" } }
调用示例
两种方法的调用逻辑完全一致:
# 获取匹配Java*的软件对象 $targetSW = Get-CimInstance -ClassName SMS_InstalledSoftware -Filter "Name LIKE 'Java%'" # 传入自定义函数 listSWInformation -Software $targetSW
验证对象类型的小技巧
如果不确定返回对象的类型,可提前用以下命令查看:
$targetSW | Get-Member # 或者查看完整类型名 $targetSW.GetType().FullName
内容的提问来源于stack exchange,提问作者beg-inner
相关产品推荐
相关产品推荐

