我知道这是一个老问题,但对于未来的读者来说,接受的答案在每种情况下都不是理想的,尤其是在循环中迭代大量数据时。
问题是如何“将对象添加到对象数组”。这篇文章的标题与给出的示例问题不符合相同的答案。相反,我的目标是解决示例中展示的问题。
虽然很容易将 append 运算符+=
与数组一起使用,但在幕后,这是一个相当浪费的过程。浪费的程度取决于您循环通过的对象的大小。
接受的答案以初始化的空数组开头$Target = @()
。然后建议使用循环$Machines
将项目附加到空数组$Target += $TargetObject
。在幕后,PowerShell 正在测量$Target
您要附加的项目的大小和大小$TargetObject
,将这些大小相加并创建一个全新的数组。然后它将内容从新数组复制/添加$Target
到新数组,然后是您要附加的对象。这个过程发生在循环中的每个项目上。如果 中有 1000 个项目$Machines
,则到操作结束时您将创建 1000 个数组。
这一切都是因为普通的旧数组是固定大小的。通过将项目附加到具有固定大小的东西,我们最终得到了这个浪费的过程。我们可以通过根本不创建新数组来避免这种情况。相反,只需将foreach
循环已经创建的数组分配给一个变量。请参阅以下示例。
$Target = foreach ($Machine in $Machines)
{
# Stuff I want to be in $Target goes here
}
其他答案之一具有正确的想法,但给出的示例不正确。为了使$Target
变量中的任何内容都结束,您必须确保将数据发送到输出流。不要与正在写入的数据相混淆Write-Host
。
这是一个工作示例:
# Mock array for illustration purposes
$Machines = @( "Machine1", "Machine2", "Machine3" )
$Target = foreach ( $Machine in $Machines )
{
# This is being sent directly to the output stream and therefore, into the $Target variable
@{ Name = $Machine }
}
您的输出应如下所示:
姓名 |
价值 |
姓名 |
机器1 |
姓名 |
机器2 |
姓名 |
机器3 |
如果您熟悉 Cmdlet Foreach-Object
,下面是等效的。您可以开始看到与我的第一个示例的相似之处。
$Target = $Machines | ForEach-Object { @{ Name = $_ } }
这篇文章涵盖了我刚刚提到的所有内容以及性能影响: