我需要根据哈希表中的值在PowerShell中做出一些决定。
基本上我需要根据属性(公司名称)在Active Directory中分配用户的UPN,并考虑创建包含这样的键和值的哈希表
Key Value Company1 @Company1.com Company2 @Company2.com
我面临的问题是我不知道如何告诉PowerShell使用值而不是基于公司属性的另一个值,基本上我不知道如何循环/检查公司属性与哈希表。
我尝试使用像
这样的开关$a -match $hashTable
或
$a -contains $hashtable
收效甚微。
我认为散列表是我在这里需要的,但我当然愿意接受任何建议,例如使用外部文件进行匹配,因为我需要匹配的公司数量相当高。
答案 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已经提出了正确的解决方案,但我想补充一些解释。
Hashtables和switch
语句基本上是针对同一问题的两种不同解决方案:将输入值转换为相应的输出。
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