我知道这是一个老问题,但对于未来的读者来说,接受的答案并不是在每种情况下都是理想的,特别是在循环遍历大量数据集时。
问题是如何"向对象数组中添加对象"。这篇帖子的标题与给出的示例问题并不适合同一个答案。相反,我旨在解决示例中展示的问题。
虽然使用数组的追加运算符
+=
很容易,但在幕后,这是一个相当浪费资源的过程。浪费的程度取决于您正在遍历的对象的大小。
接受的答案从一个初始化的空数组
$Target = @()
开始。然后建议通过循环
$Machines
将项目追加到空数组中,使用
$Target += $TargetObject
。在幕后,PowerShell测量
$Target
的大小和你要追加的项目
$TargetObject
的大小,将这些大小相加并创建一个全新的数组。然后将
$Target
的内容复制/添加到新数组中,然后再添加要追加的对象。这个过程在每个循环项中都会发生。如果
$Machines
中有1000个项目,那么在操作结束时,你将创建1000个数组。
所有这些都是因为普通的数组是固定大小的。通过向具有固定大小的对象追加项目,我们最终得到了这种浪费资源的过程。我们可以通过根本不创建新数组来避免这种情况。相反,只需将
foreach
循环已经创建的数组分配给一个变量。请参考以下示例。
$Target = foreach ($Machine in $Machines)
{
}
其中一个其他答案有正确的想法,但给出的示例是不正确的。为了让任何东西最终出现在
$Target
变量中,您必须确保数据被发送到
成功输出流。不要将其与使用类似
Write-Host
的东西写入
信息流的数据混淆。
这是一个有效的示例:
$Machines = @( "Machine1", "Machine2", "Machine3" )
$Target = foreach ( $Machine in $Machines )
{
@{ Name = $Machine }
}
你的输出应该像这样:
名称 |
数值 |
名称 |
机器1 |
名称 |
机器2 |
名称 |
机器3 |
如果你熟悉Cmdlet Foreach-Object
,下面是等效的。你可以开始看到与我第一个示例的相似之处。
$Target = $Machines | ForEach-Object { @{ Name = $_ } }
这些文章详细介绍了我刚才提到的所有内容以及性能影响。
+=
会杀掉小狗。 - js2010