如何将数组中相似的PSObject合并为单个对象并保留原属性?
合并分页API返回的相似PSObject集合
问题说明
我有一个来自分页API查询的PowerShell数组$events,数组中的每一项对应一个查询页面,示例输出如下:
PS C:\Test\$events total events ----- ------ 867 @{category_id=1; content_ver=Version: 2022-10-26 rev. 008; Sequence: 221026008; count=1; cybox=; device_end_time=1666837251000; device_ip=X.X.X.X; device_location=; device_time=1666837251000; feature_name=MALWARE_PROTECTION; feature_ui… 867 @{category_id=1; content_ver=Version: 2022-10-30 rev. 003; Sequence: 221030003; count=1; cybox=; device_end_time=1667163237000; device_ip=X.X.X.X; device_location=; device_time=1667163237000; feature_name=MALWARE_PROTECTION; feature_uid=… 867 @{category_id=1; content_ver=Version: 2022-10-30 rev. 003; Sequence: 221030003; count=1; cybox=; device_end_time=1667163237000; device_ip=X.X.X.X; device_location=; device_time=1667163237000; feature_name=MALWARE_PROTECTION; feature_uid=… 867 @{category_id=1; content_ver=Version: 2022-10-30 rev. 003; Sequence: 221030003; count=1; cybox=; device_end_time=1667163237000; device_ip=X.X.X.X; device_location=; device_time=1667163237000; feature_name=MALWARE_PROTECTION; feature_uid=… 867 @{category_id=1; content_ver=Version: 2022-10-30 rev. 003; Sequence: 221030003; count=1; cybox=; device_end_time=1667163237000; device_ip=X.X.X.X; device_location=; device_time=1667163237000; feature_name=MALWARE_PROTECTION; feature_uid=…
每个页面的events属性下的PSObject结构完全一致,需要将所有页面的events对象合并为一个统一集合,同时保留原有全部属性。
解决方法
方法1:直接利用成员枚举(最简便)
PowerShell的成员枚举特性会自动遍历集合中每个元素的指定属性,并将结果合并为一个数组:
$mergedEvents = $events.events
方法2:使用Select-Object展开属性
如果需要更明确的操作逻辑,用-ExpandProperty参数直接提取并展开每个元素的events属性:
$mergedEvents = $events | Select-Object -ExpandProperty events
方法3:遍历收集(支持自定义处理)
如果合并过程中需要添加过滤、转换等自定义逻辑,用ForEach-Object遍历处理:
# 基础写法(数据量小时适用) $mergedEvents = @() $events | ForEach-Object { $mergedEvents += $_.events # 可在此添加自定义逻辑,比如过滤特定category_id的对象 # $mergedEvents += $_.events | Where-Object { $_.category_id -eq 1 } } # 大数据量优化写法(避免数组扩容性能损耗) $mergedEvents = New-Object System.Collections.ArrayList $events | ForEach-Object { [void]$mergedEvents.AddRange($_.events) }
验证结果
合并完成后,可通过以下命令确认结果:
# 查看合并后的总对象数 $mergedEvents.Count # 查看对象的属性结构(确保属性完整保留) $mergedEvents[0] | Get-Member -MemberType NoteProperty
内容的提问来源于stack exchange,提问作者Douda
相关产品推荐
相关产品推荐

