【问题标题】:Possible to compress variable substitution in powershell?可以在powershell中压缩变量替换吗?
【发布时间】:2018-08-13 16:16:09
【问题描述】:

我正在尝试使用 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"}

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

【问题讨论】:

  • 顺便说一句:PowerShell中的相等比较运算符是-eq,所以一定是if ($OU -eq "Oregon") ...,而不是if ($OU = "Oregon") ...;后者执行 assignment.

标签: powershell variables hashtable ou


【解决方案1】:

使用 有序哈希表 (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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    相关资源
    最近更新 更多