PowerShell使用Select-Object转JSON时避免列表变形的方法问询
问题原因
该异常由PowerShell默认的管道枚举机制导致:计算属性的表达式返回集合时,PowerShell会自动展开集合元素:仅返回1个元素时会直接转为标量对象,返回多个元素时会被封装为带value和Count属性的PSCollection对象,序列化为JSON时就会出现不符合预期的结构。
解决方案
修改StorageQoSPolicies对应的计算属性表达式,使用一元逗号操作符强制保留数组结构,避免被自动展开:
$Cloud = Get-SCCloud -ID 'bbf6a193-4439-4053-9772-7228e3be3db9'; function Expand-SCCloud() { Param( [Parameter( Mandatory = $true, ValueFromPipeline = $true) ] $rawObj ) $CloudCapacity_Filter_001 = @{Name = 'CloudCapacity'; Expression = { $_.CloudCapacity | Select-Object CPUCount, MemoryMB, VMCount } }; # 仅修改这一行:返回结果前加一元逗号,强制保留数组结构 $StorageQoSPolicies_Filter_002 = @{Name = 'StorageQoSPolicies'; Expression = { , ($_.StorageQoSPolicies | Select-Object IOPSMaximum, IOPSMinimum, BandwidthLimit, ID, PolicyID, Name) } }; $rawObj_json = $rawObj | Select-Object Name, $CloudCapacity_Filter_001, $StorageQoSPolicies_Filter_002 | ConvertTo-JSON -Depth 3; return $rawObj_json; }; $Cloud | Expand-SCCloud;
也可以用@()包裹表达式返回结果实现相同效果:
Expression = { @($_.StorageQoSPolicies | Select-Object IOPSMaximum, IOPSMinimum, BandwidthLimit, ID, PolicyID, Name) }
修改后StorageQoSPolicies会以原生数组结构序列化,输出符合预期。
内容的提问来源于stack exchange,提问作者nascarsayan
相关产品推荐
相关产品推荐

