PowerShell合并两个自定义对象属性生成统一自定义对象的方法
PowerShell 无关联字段REST接口数据合并的标准实现
核心实现逻辑
因为第二个接口返回结果不携带可关联的ID字段,不要尝试先批量拉取所有关联数据再做匹配,直接在遍历主数据集的上下文内完成单条记录的接口调用、属性合并,从根源避免嵌套结构、匹配错位的问题。
常规场景推荐写法
这种写法输出的是标准平面对象集合,可直接导出CSV、做配置差异比对,没有嵌套结构问题:
# 直接用foreach循环的输出收集结果,不需要手动维护嵌套结构 $d = foreach ($mainRecord in $a) { # 传入当前记录ID调用第二个接口,拿到对应关联数据 $relatedRecord = Invoke-RestMethod -Uri "你的第二个接口地址/$($mainRecord.ID)" -Method Get # 合并两个对象的属性生成单条平面对象 [pscustomobject]@{ ID = $mainRecord.ID Title = $mainRecord.Title Location = $mainRecord.Location 'Internal IP Address' = $mainRecord.'Internal IP Address' 'NATed IP Address' = $relatedRecord.'NATed IP Address' 'Last Provisioned Time' = $relatedRecord.'Last Provisioned Time' } }
如果接口返回字段较多,不想手动逐一枚举属性,可以用自动属性拷贝的方式实现合并,只要两个接口返回的字段没有重名就可以正常工作:
$d = foreach ($mainRecord in $a) { $relatedRecord = Invoke-RestMethod -Uri "你的第二个接口地址/$($mainRecord.ID)" # 初始化空的自定义对象 $merged = [pscustomobject]::new() # 拷贝主记录所有属性 $mainRecord.PSObject.Properties | ForEach-Object { $merged | Add-Member -NotePropertyName $_.Name -NotePropertyValue $_.Value } # 拷贝关联记录所有属性 $relatedRecord.PSObject.Properties | ForEach-Object { $merged | Add-Member -NotePropertyName $_.Name -NotePropertyValue $_.Value } # 输出合并后的对象,会被自动收集到$d中 $merged }
常见问题规避
- 不要用哈希表多层嵌套的方式累加数据:如果直接把关联对象整体作为哈希表的一个属性值存储,最终会得到嵌套结构,导出CSV时只会显示对象类型名,无法得到预期的平面表格。
- 不要先批量拉取所有关联数据再匹配:第二个接口不返回关联ID的前提下,批量拉取后的结果顺序无法保证和主记录一一对应,很容易出现数据匹配错位。
- 管道收集异常处理:如果遇到循环输出无法被正确收集的问题,不要在循环内部用
+=拼接数组(这种写法性能极差),直接用上面演示的$变量 = foreach (循环条件) { 输出对象 }的写法即可,PowerShell会自动把循环内所有输出收集为标准数组,不需要手动维护集合。
大数据量优化
如果主数据集记录数较多,可以用PowerShell 7及以上版本支持的ForEach-Object -Parallel实现并行接口调用,合并逻辑和串行写法完全一致,最终输出的结果结构不变,可大幅降低总耗时。
内容的提问来源于stack exchange,提问作者Swinster
相关产品推荐
相关产品推荐

