PowerShell向数组追加对象时所有值被覆盖的问题求助
问题原因
你遇到的问题是因为始终复用同一个对象实例。PowerShell中对象属于引用类型,$array += $object添加的是对象的引用而非副本。每次循环修改$object的属性时,数组里所有已添加的引用都会指向这个被修改的对象,最终导致所有元素都显示最后一次修改的值。
解决方案
有两种常用的修复方式:
方式1:每次循环创建新对象
在循环内部每次实例化新的对象,确保添加到数组的都是独立实例:
$array = @() foreach ($i in $users.Users){ if($i.UserName -like "JS*"){ # 每次循环新建独立对象 $object = [PSCustomObject]@{ Username = $i.UserName Name = $i.Name } $array += $object } } $array
方式2:用管道高效构建数组(推荐)
+=操作数组会反复创建新数组,数据量大时效率低下。用管道结合筛选和选择可以更简洁高效地实现需求:
$array = $users.Users | Where-Object { $_.UserName -like "JS*" } | Select-Object Username, Name $array
逻辑验证
你提供的迭代输出正好印证了引用问题:
- 迭代1:数组仅包含1个对象引用,显示当前属性值
- 迭代2:数组包含2个同一对象的引用,修改属性后两个元素同步变化
- 迭代3:数组包含3个同一对象的引用,全部随最后一次修改同步更新
内容的提问来源于stack exchange,提问作者Wubs
相关产品推荐
相关产品推荐

