第一篇文章,我整天都在研究这个问题而且我的智慧结束了!我有一个名为$ 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不是一个真正的数组,但它包含我需要添加到新列表中的两个命名元素。我怎样才能做到这一点?
答案 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