Powershell:将对象添加到对象数组

Posted

技术标签:

【中文标题】Powershell:将对象添加到对象数组【英文标题】:Powershell: Add objects to an array of objects 【发布时间】:2012-07-01 05:37:54 【问题描述】:

我有这个脚本,我想在每个 foreach 中将一个对象添加到一个名为 $Target 的数组中。

foreach ($Machine in $Machines)

  $TargetProperties = @Name=$Machine  
  $TargetObject = New-Object PSObject –Property $TargetProperties
  $Target= @()
  $Target =  $TargetObject

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

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

【问题讨论】:

【参考方案1】:

要追加到数组,只需使用+= 运算符。

$Target += $TargetObject

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

【讨论】:

+= 杀死小狗。【参考方案2】:

通常人们这样做时不会使用效率低下的“+=”,因为每次都会创建一个新的数组副本:

$Target = foreach ($Machine in $Machines)

  $TargetProperties = @Name=$Machine  
  $TargetObject = New-Object PSObject –Property $TargetProperties

【讨论】:

这段代码需要一些工作,但它实际上非常简洁。照原样,如果运行, foreach 循环实际上不会输出任何内容。因此,$Target = 实际上并没有捕捉到任何东西。删除$TargetObject = 行将导致foreach 循环在运行时吐出一系列对象。这反过来又被原始的$Target = 行捕获,现在您有了一个漂亮的对象数组。整洁。【参考方案3】:

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

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

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

接受的答案以初始化的空数组$Target = @() 开头。然后建议使用$Target += $TargetObject 循环通过$Machines 将项目附加到空数组。在幕后,PowerShell 正在测量 $Target 的大小和您要附加的项目的大小 $TargetObject,将这些大小相加并创建一个全新的数组。然后它将$Target 中的内容复制/添加到新数组,然后是您要附加的对象。这个过程发生在循环中的每个项目上。如果$Machines 中有 1000 个项目,那么到操作结束时您将创建 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  

您的输出应如下所示:

Name Value
Name Machine1
Name Machine2
Name Machine3

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

$Target = $Machines | ForEach-Object  @ Name = $_  

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

https://vexx32.github.io/2020/02/15/Building-Arrays-Collections/ https://www.pipehow.tech/new-arraylist/

【讨论】:

这是一个非常好的、清晰的解释,并且绝对是生产系统上经常使用的脚本的方式。 对于您的管道示例,我认为您想要% @ Name = $_ ... 使用$_ 而不是$Machine,因为$Machine 变量从未在您的第二个示例中定义并且将为空 @immobile2 这是我的疏忽。你是对的,谢谢你。固定

以上是关于Powershell:将对象添加到对象数组的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 PowerShell 将“设备和打印机”中的对象查询到数组中

PowerShell:如何在 PowerShell 中将数组对象转换为字符串?

如何将对象添加到数组

将对象数组添加到单个数组中

将对象添加到java mongodb中的数组

如何将对象添加到数组中?