我想在powershell中创建一个ou的哈希表

时间:2013-12-09 02:27:12

标签: powershell-v3.0

我想要做的是创建一个Ou表并将数值分配给内存。如果你被删除我希望它从哈希表中删除。如果创建了一个新的ou,我希望它被添加到哈希表中。但我希望它填补缺失的数值,例如,如果我有1到5但3删除我想将新值添加到3或如果他们都在那里添加新的数字,如6

function Set-ZLGroupTable{
    $ADOU = (Get-ChildItem "AD:\$OUath").Name
    $GroupTable = @{}
    foreach($GroupName in $ADOU){
    for($count = 0 ; $count -le $ADOU.count; $count++){
        if(!($GroupTable.contains($GroupName))){
            if(!($GroupTable.Keys($count))){
                $GroupTable[$count] = "$GroupName"
                }else{
                    $GroupTable[($ADOU.count++)] = "$GroupName"
                }
           }
     }
    }
    Write-Output $GroupTable

}

1 个答案:

答案 0 :(得分:0)

原始代码存在一些问题。

首先,您需要通过以下方式获取OU名称列表:

$ADOU = (Get-ChildItem "AD:\$OUPath")|Select -ExpandProperty Name

您对Hashtable的使用似乎不正确。以下行不确定OU名称是否作为GroupTable中的值存在:

if(!($GroupTable.contains($GroupName))){

为了确定您需要按照以下方式执行某些操作:

if(!($GroupTable.Values -contains $GroupName)){

在您的原始规范上,您说您希望保留订单,但如果删除了OU,则该数字仍可供下一个可用的OU名称占用。您上面提供的脚本会将OU添加到下一个可用的数字中,无论它是否被占用。您需要做的是首先从源列表中删除哈希表中已存在的任何项目,然后枚举剩余的项目并递增计数,直到找到放置它的位置为止。此外,应首先进行删除以释放这些密钥,以便以后插入其中。像这样:

#First we remove items from our list that don't exist in $ADOU
foreach ($key in $GroupTable.Keys){
  if (!($ADOU -contains $GroupTable."$key")){
    $GroupTable.Remove($key)
  }
}
#Next we check if the remaining items already exist in the GroupTable
foreach ($GroupName in $ADOU)
{
  if(($GroupTable.Values -contains $GroupName)){
    #It's already in the GroupTable. Let's not do anything further with it
    $ADOU=$ADOU -ne "$GroupName"
  }
}
#Finally, insert any new OU's into the available GroupTable List:
#Keep increasing the counter until the ADOU array is empty
for ($count = 0; $ADOU.Count -gt 0; $count++)
{
  if ($GroupTable."$count" -eq $null)
  {
    #Add the OU to the table
    $GroupTable."$count" = $ADOU[0]
    #Remove the OU from the list
    $ADOU=$ADOU -ne $ADOU[0]
  }
}

Hashtable输出的问题是键很少按顺序打印。在我自己的环境中测试这个我得到5,0,4,6,1,2,3作为我的订单。

我希望有所帮助。

谢谢,克里斯。