可以在 powershell 中压缩变量替换吗?
Possible to compress variable substitution in powershell?
我正在尝试使用 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"}
单击任一按钮会用友好名称填充列表框,但是有没有更简单的方法将这些友好名称映射到不同的路径?
使用有序哈希表 (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"
}
然后您可以按部门(hr
和 sales
,在您的情况下)枚举和过滤它,并使用每个条目的 .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
returns 之前添加到列表中的单个友好名称):
$ou = $ous[$WPFOU_List.SelectedItems]
我正在尝试使用 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"}
单击任一按钮会用友好名称填充列表框,但是有没有更简单的方法将这些友好名称映射到不同的路径?
使用有序哈希表 (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"
}
然后您可以按部门(hr
和 sales
,在您的情况下)枚举和过滤它,并使用每个条目的 .Key
属性 - 其中包含友好名称 - 填充列表;由于使用 .Where()
.
以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
returns 之前添加到列表中的单个友好名称):
$ou = $ous[$WPFOU_List.SelectedItems]