在PowerShell中使用带有switch case的Hashtable

时间:2017-04-14 10:46:13

标签: powershell hashtable

我需要根据哈希表中的值在PowerShell中做出一些决定。

基本上我需要根据属性(公司名称)在Active Directory中分配用户的UPN,并考虑创建包含这样的键和值的哈希表

Key         Value
Company1    @Company1.com
Company2    @Company2.com

我面临的问题是我不知道如何告诉PowerShell使用值而不是基于公司属性的另一个值,基本上我不知道如何循环/检查公司属性与哈希表。

我尝试使用像

这样的开关
$a -match $hashTable

$a -contains $hashtable

收效甚微。

我认为散列表是我在这里需要的,但我当然愿意接受任何建议,例如使用外部文件进行匹配,因为我需要匹配的公司数量相当高。

2 个答案:

答案 0 :(得分:3)

-match-contains不是“开关”,而是运算符

-match运算符将一个字符串作为其左侧参数,并将其与正则表达式模式进行比较,而$hashtable不能替代。{/ p>

-contains运算符将一个集合(数组或列表)作为其左侧参数,并将其与右侧的标量值进行比较,以查看集合是否包含标量值。也不能立即适用于您的哈希表。

您可以使用ContainsKey()方法测试给定密钥是否存在,然后使用索引器($table[$key])来提取值:

$UPNSuffix = if($HashTable.ContainsKey($User.Company)){
    # Company name exists in hashtable extract UPN suffix
    $HashTable[$User.Company]
}
else {
    # Not found, return default UPN suffix
    "@default.company1.com"
}

或者使用哈希表的-contains上的Keys运算符代替ContainsKey()

$UPNSuffix = if($HashTable.Keys -contains $User.Company){
    # Company name exists in hashtable extract UPN suffix
    $HashTable[$User.Company]
}
else {
    # Not found, return default UPN suffix
    "@default.company1.com"
}

答案 1 :(得分:3)

虽然Mathias已经提出了正确的解决方案,但我想补充一些解释。

Hashtablesswitch语句基本上是针对同一问题的两种不同解决方案:将输入值转换为相应的输出。

A → "foo"
B → "bar"
C → "baz"
...

哈希表是更简单(更快)的方法,您可以在预定义表中查找输入值的结果。它们的优点是您可以在一个地方实现关联(例如,您定义所有(静态)数据的代码的声明部分),并以非常简单的方式在代码中的任何其他位置使用它们:

$domains = @{
  'Company1' = '@Company1.com'
  'Company2' = '@Company2.com'
}

$name    = 'foo'
$company = 'Company1'

$addr = $name + $domains[$company]

switch陈述在处理上更复杂,但也更通用。例如,除简单查找外,它们还允许不同类型的比较(通配符,正则表达式)。如果未列出值,它们还允许提供默认值/操作。使用哈希表时,您需要使用Mathias显示的其他if / else语句来处理这些情况,除非您对查找找不到匹配项时哈希表返回的空值没有问题。 / p>

$name    = 'foo'
$company = 'Company1'

$domain = switch ($company) {
  'Company1' { '@Company1.com' }
  'Company2' { '@Company2.com' }
  default    { throw 'Unknown company' }
}

$addr = $name + $domain