可以在powershell中压缩变量替换吗?

时间:2018-03-05 21:53:26

标签: powershell variables hashtable ou

我尝试使用GUI创建一个脚本,允许我为组织创建用户帐户并将用户帐户分配给各个OU。我的问题是我想在列表框中显示一个简单的名称,并将选择映射到OU的正确可分辨名称,但要做到这一点,我必须手动重新分配变量,如下所示:

$OU = WPFOU_List.SelectedItems

$WPFHR_Staff.Add_Click({
   $WPFOU_List.Items.Clear()
   $WPFOU_List.Items.Add("Oregon")
   $WPFOU_List.Items.Add("Colorado")
   $WPFOU_List.Items.Add("California")
})

$WPFSales_Staff.Add_Click({
   $WPFOU_List.Items.Clear()
   $WPFOU_List.Items.Add("Portland")
   $WPFOU_List.Items.Add("Denver")
   $WPFOU_List.Items.Add("Los Angeles")
})


if ($OU = "Oregon")
{$OU = "ou=oregon,ou=hr,dc=my,dc=org,dc=com"}
elseif ($OU = "Colorado")
{$OU = "ou=colorado,ou=hr,dc=my,dc=org,dc=com"}
elseif ($OU = "California")
{$OU = "ou=california,ou=hr,dc=my,dc=org,dc=com"}
elseif ($OU = "Portland")
{$OU = "ou=portland,ou=sales,dc=my,dc=org,dc=com"}
elseif ($OU = "Denver")
{$OU = "ou=denver,ou=sales,dc=my,dc=org,dc=com"}
elseif ($OU = "Los Angeles")
{$OU = "ou=la,ou=sales,dc=my,dc=org,dc=com"}

单击其中一个按钮会使用友好名称填充列表框,但有没有更简单的方法将这些友好名称映射到可分辨的路径?

1 个答案:

答案 0 :(得分:2)

使用有序哈希表(PSv3 +)来定义友好名称及其关联的OU:

$ous = [ordered] @{
  Oregon        = "ou=oregon,ou=hr,dc=my,dc=org,dc=com"
  Colorado      = "ou=colorado,ou=hr,dc=my,dc=org,dc=com"
  # ...
  'Los Angeles' = "ou=la,ou=sales,dc=my,dc=org,dc=com"
}

然后,您可以按部门(hrsales(根据您的情况)对其进行枚举和过滤,并使用每个条目的.Key属性 - 其中包含友好名称 - 填充列表;因使用.Where()而需要PSv4 +。

hr为例:

$WPFHR_Staff.Add_Click({
   $WPFOU_List.Items.Clear()
   # Note that in order to enumerate hashtables you must use .GetEnumerator()
   foreach ($ouEntry in $ous.GetEnumerator().Where({ $_.Value -match ',ou=hr,' })) {
     $WPFOU_List.Items.Add($ouEntry.Key) # .Key is the friendly name
   }
})

注意:出于性能原因,上述内容仅适用于 smallish 哈希表;需要更多复杂的OU,需要更复杂的方法。

根据所选列表项获取完整的OU名称(假设.SelectedItems返回先前添加到列表中的单个友好名称):

$ou = $ous[$WPFOU_List.SelectedItems]