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