在Powershell中将对象添加到对象数组中

Ric*_*olo 35 arrays powershell scripting

我有这个脚本,我想$Target在每个foreach中调用的数组中添加一个对象.

foreach ($Machine in $Machines)
{
  $TargetProperties = @{Name=$Machine}  
  $TargetObject = New-Object PSObject –Property $TargetProperties
  $Target= @()
  $Target =  $TargetObject
}
Run Code Online (Sandbox Code Playgroud)

我知道它不起作用,因为$Target = $TargetObject它使它等于同一个对象.

如何附加到数组而不是替换?

Spe*_*ngD 79

要附加到数组,只需使用+=运算符即可.

$Target += $TargetObject

此外,您需要$Target = @()在循环之前声明,否则,它将在每个循环中清空数组.

  • `+=` 会杀死小狗。 (11认同)

HiT*_*ech 14

我知道这是一个老问题,但对于未来的读者来说,接受的答案并不适合每种情况,尤其是在循环中迭代大量数据时。

问题是如何“将对象添加到对象数组”。这篇文章的标题与给出的示例问题不符合相同的答案。相反,我的目标是解决示例中演示的问题。

虽然+=在数组中使用追加运算符很容易,但在幕后,这是一个相当浪费的过程。浪费的程度取决于您循环的对象的大小。

接受的答案以初始化的空数组开始$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
}
Run Code Online (Sandbox Code Playgroud)

其他答案之一的想法是正确的,但给出的例子不正确。为了使任何内容最终出现在$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 } 
}
Run Code Online (Sandbox Code Playgroud)

你的输出应该是这样的:

姓名 价值
姓名 机器1
姓名 机器2
姓名 机器3

如果您熟悉 Cmdlet Foreach-Object,下面是等效的。您可以开始看到与我的第一个示例的相似之处。

$Target = $Machines | ForEach-Object { @{ Name = $_ } }
Run Code Online (Sandbox Code Playgroud)

这些文章涵盖了我刚才提到的所有内容以及性能影响: