2013-12-09 2 views
1

Что я хочу сделать, это создать таблицу Ou и присвоить числовое значение в памяти. Если удаление удаляется, я хочу, чтобы он был удален из хеш-таблицы. если новый ou создан, я хочу, чтобы он добавился в хэш-таблицу. Но я хочу, чтобы заполнить недостающую числовое значение, например, если у меня есть 1 до 5, но 3 были удалены, я хочу, чтобы добавить новое значение 3 или, если они все там, чтобы добавить новый номер, как 6Я хочу создать хэш-таблицу ou's в powershell

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 

} 

ответ

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 в качестве своего заказа.

Я надеюсь, что это поможет.

Спасибо, Крис.

Смежные вопросы