新號碼
您的原始代碼有幾個問題。
首先,你需要獲得OU名稱列表方式如下:
$ADOU = (Get-ChildItem "AD:\$OUPath")|Select -ExpandProperty Name
你的哈希表的使用似乎並不正確。下面這行沒有確定,如果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作爲我的訂單。
我希望有幫助。
謝謝,克里斯。