使用assign by addition将元素添加到新数组,但原始数组值也会动态更改新数组元素

时间:2012-07-10 22:10:40

标签: arrays powershell

第一篇文章,我整天都在研究这个问题而且我的智慧结束了!我有一个名为$ Global:CBCGroups的数组,我想要包含一个名为$ Global:CBCTempHolder的不断变化的变量的值。每当$ Global:CBCTempHolder被更改时,我希望它将它的内容添加到数组$ Global:CBCGroups使用+ =(即:

$Global:CBCGroups += $Global:CBCTempHolder

CBCGroups中的列是CBCGroup和Element。 $ Global:CBCTempHolder中也存在相同的值,但每个“For”语句中的值都会发生变化。这是代码:

$Global:CBCGroups = @()


for ($z = 0; $z -lt $Global:UniqueCCData.count; $z +=1)
{
If ($Global:UniqueCCData[$z]."AD Group".Contains("CBC_CBC_") -eq $True)
{
        $Global:CBCTempHolder = @(0) * 1 | select CBCGroup,Element
        $Global:CBCTempHolder.CBCGroup = $Global:UniqueCCData[$z]."AD Group"
        $Global:CBCTempHolder.Element = $z
        $Global:CBCGroups += $Global:CBCTempHolder
        $Global:UniqueCCData[$z]."AD Group" = $Global:UniqueCCData[$z]."AD Group".Replace("CBC_CBC_","CBC.CBC")

    }
}

所以,基本上发生的事情是每当我向$ Global添加新元素时:CBCGroups通过:

$Global:CBCGroups += $Global:CBCTempHolder

我注意到每当我更改$ Global:CBCTempHolder的值,然后手动将$ Global:CBCTempHolder.CBCGroup的值更改为任何内容时,使用assign by addition运算符连续添加5个元素,然后更改$ Global:CBCTempHolder的值再次手动,它将$ Global中的最后5个元素:CBCGroups更改为相同的值!我需要$ Global:CBCGroups中的每个元素来保持它从添加到数组时的值。

我意识到$ Global:CBCTempHolder不是一个真正的数组,但它包含我需要添加到新列表中的两个命名元素。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

以下是展示问题的代码:

$UniqueCCData = @()
$UniqueCCData += new-object psobject -property @{ "AD Group" = "Domain Users" }
$UniqueCCData += new-object psobject -property @{ "AD Group" = "CBC_CBC_Enterprise Admins" }
$UniqueCCData += new-object psobject -property @{ "AD Group" = "CBC_CBC_Help Desk" }
$UniqueCCData += new-object psobject -property @{ "AD Group" = "CBC_CBC_Marketing" }
$UniqueCCData += new-object psobject -property @{ "AD Group" = "CBC_CBC_Sales" }
$UniqueCCData += new-object psobject -property @{ "AD Group" = "Domain Admins" }
$CBCGroups = @()
for ($z = 0; $z -lt $UniqueCCData.count; $z += 1)
{
    if ($UniqueCCData[$z]."AD Group".Contains("CBC_CBC_") -eq $True)
    {
        $CBCTempHolder = @(0) * 1 | select CBCGroup,Element
        $CBCTempHolder.CBCGroup = $UniqueCCData[$z]."AD Group"
        $CBCTempHolder.Element = $z
        $CBCGroups += $CBCTempHolder
        $UniqueCCData[$z]."AD Group" = $UniqueCCData[$z]."AD Group".Replace("CBC_CBC_","CBC.CBC")
    }
}
$CBCTempHolder.CBCGroup = "CBC_CBC_VIPs"
$CBCTempHolder.Element = 5
$CBCGroups += $CBCTempHolder
$CBCGroups

这是输出:

CBCGroup                    Element
--------                    -------
CBC_CBC_Enterprise Admins         1
CBC_CBC_Help Desk                 2
CBC_CBC_Marketing                 3
CBC_CBC_VIPs                      5
CBC_CBC_VIPs                      5

问题是分配了对象的引用。因此,当对象更改时,引用它的任何对象似乎也会更改。解决此问题的方法是为CBCGroups的每个索引分配唯一对象。以下是我如何解决它:

function CBC_clone($group, $i)
{
    $temp = @(0) * 1 | select CBCGroup,Element
    $temp.CBCGroup = $group.Replace("CBC_CBC_","CBC.CBC")
    $temp.Element = $i
    return $temp
}
$UniqueCCData = @()
$UniqueCCData += new-object psobject -property @{ "AD Group" = "Domain Users" }
$UniqueCCData += new-object psobject -property @{ "AD Group" = "CBC_CBC_Enterprise Admins" }
$UniqueCCData += new-object psobject -property @{ "AD Group" = "CBC_CBC_Help Desk" }
$UniqueCCData += new-object psobject -property @{ "AD Group" = "CBC_CBC_Marketing" }
$UniqueCCData += new-object psobject -property @{ "AD Group" = "CBC_CBC_Sales" }
$UniqueCCData += new-object psobject -property @{ "AD Group" = "Domain Admins" }
$CBCGroups = @()
for ($z = 0; $z -lt $UniqueCCData.count; $z += 1)
{
    if ($UniqueCCData[$z]."AD Group".Contains("CBC_CBC_") -eq $True)
    {
        $CBCGroups += (CBC_clone $UniqueCCData[$z]."AD Group" $z)
    }
}
$CBCGroups += (CBC_clone "CBC_CBC_VIPs" 5)
$CBCGroups

这会产生所需的输出:

CBCGroup                 Element
--------                 -------
CBC.CBCEnterprise Admins       1
CBC.CBCHelp Desk               2
CBC.CBCMarketing               3
CBC.CBCSales                   4
CBC.CBCVIPs                    5