使用Invoke-Command远程执行Get-ComputerInfo返回格式异常的原因及解决
异常原因
PowerShell 远程调用过程中,所有跨机器返回的对象都会经过序列化、反序列化流程:远程主机执行完脚本块后,会将结果对象序列化为 CLIXML 格式传输到本地,本地再将其反序列化为可操作对象。
这个转换过程会丢失原始对象的强类型信息:OsProductType 原本是 [Microsoft.PowerShell.Commands.OSProductType] 枚举类型,反序列化后会被包装为通用的反序列化对象,实际枚举值存储在该对象的Value属性中,你看到的类子对象结构就是这个包装结构导致的。
另外输出中的PSComputerName、RunspaceId是Invoke-Command默认给所有远程返回对象附加的元属性,用来标记对象的来源信息,本地执行不会生成这类属性。
解决方案
方案1:远程侧直接返回基础类型(推荐,返回结果和本地完全一致)
在远程执行的脚本块内就将属性转换为字符串等基础类型,避免序列化丢失类型信息:
$ComputerInfo = Invoke-Command -ComputerName $FQDN -ScriptBlock { $rawInfo = Get-ComputerInfo -Property OsName, OsProductType return [PSCustomObject]@{ OsName = $rawInfo.OsName OsProductType = $rawInfo.OsProductType.ToString() } } | Select-Object OsName, OsProductType
末尾的Select-Object用来过滤掉Invoke-Command附加的元属性,最终返回的对象结构和本地执行结果完全一致。
方案2:本地侧适配反序列化结构
如果不想修改远程调用逻辑,本地取值时直接访问Value属性即可拿到实际值:
# 直接取包装对象的Value属性获取真实值 $ComputerInfo.OsProductType.Value
内容的提问来源于stack exchange,提问作者Perre
相关产品推荐
相关产品推荐

