0

第一篇文章,我整天都在研究这个,我束手无策!我有一个名为 $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 的值更改为任何值时,使用加法分配运算符连续添加 5 个元素,然后更改再次手动 $Global:CBCTempHolder,它将 $Global:CBCGroups 中的最后 5 个元素更改为相同的值!我需要 $Global:CBCGroups 中的每个元素从它添加到数组时起保持它的值。

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

4

1 回答 1

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
于 2012-07-10T22:42:27.500 回答