You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:40:00