Powershell数组值被覆盖

时间:2014-04-09 14:44:18

标签: arrays powershell

我有点不知道为什么这段代码没有按照我的想法去做。

这是更大计划的一部分,但实质上我试图用文本文件中的条目填充数组的一部分,尽管我用硬编码数组替换了该位。最终结果是一样的。

$users = 12345,23456,34567,45678,56789,67890

$a = New-Object PSCustomObject
$a = $a|Select ID
$collection = @()

$users|%{
    $a.ID = $_
    $collection += $a
}

$collection|ft -a

这输出以下内容:

   ID
   --
67890
67890
67890
67890
67890
67890

如果在构建时将阵列输出到屏幕,则可以观察每次使用最新条目替换值。 什么是错?我初始化$ a变量或数组的方式有什么不寻常之处吗?

4 个答案:

答案 0 :(得分:2)

这样做是因为只有一个对象($ a),而你所有的循环正在做的是改变一个属性(ID)的值,并向数组中添加另一个对象的引用。

您需要为循环的每个循环创建一个新对象:

$users = 12345,23456,34567,45678,56789,67890

$a = New-Object PSCustomObject
$a = $a|Select ID
$collection = @()

$users|%{
    $a = New-Object PSCustomObject
    $a = $a|Select ID
    $a.ID = $_
    $collection += $a
}

$collection|ft -a

答案 1 :(得分:0)

不太确定你在这里想要完成什么,真的......但如果你这样尝试怎么办?

$collection += $a.ID

答案 2 :(得分:0)

PS正在将对象本身的引用添加到数组中,而不是添加时的对象内容。在任何时候更改$a.ID的值都会更改$collection显示的内容。

要解决此问题,您可以在$a语句中移动%的初始化,如下所示:

$users = 12345,23456,34567,45678,56789,67890

$collection = @()

$users|%{
    $a = New-Object PSCustomObject
    $a = $a|Select ID
    $a.ID = $_
    $collection += $a
}

$collection|ft -a

或者只是简单地将$a.ID添加到$collection,如果您只想要该数组中的ID值。

答案 3 :(得分:0)

您创建一个对象($ a)。然后,您将此一个对象多次添加到$ collection。每次添加它都会更改其.ID属性值。所以最后你有$ collection包含这个对象的许多副本。因此,您可以获得该ID值的许多副本。如果您希望多个对象具有不同的值,则每次在循环内创建一个新对象。