我想要做的是创建一个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
}
答案 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作为我的订单。
我希望有所帮助。
谢谢,克里斯。