Есть несколько проблем с вашим исходным кодом.
Во-первых, вам нужно получить список имен 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 в качестве своего заказа.
Я надеюсь, что это поможет.
Спасибо, Крис.