从对象数组初始化哈希表?
我是 powershell 的新手,因为在不到一天的时间里。我有一个从Get-ADUser调用返回的对象数组。我将进行大量查找,因此认为最好从中构建一个哈希表。
是否有一种速记方法可以使用此数组初始化哈希表并指定对象的属性之一以用作键?
还是我必须循环整个数组并手动添加到集合中?
$adSet = @{}
foreach ($user in $allusers) {
$adSet.add($user.samAccountname, $user)
}
回答
[...] 我必须循环吗
是的
...整个阵列...
不
您不必具体化数组并使用循环语句(如foreach(){...}),您也可以使用管道将对象流转换为哈希表,使用ForEach-Objectcmdlet - 如果输入源(在下面的例子,那将是Get-Service)很慢:
$ServiceTable = Get-Service |ForEach-Object -Begin { $ht = @{} } -Process { $ht[$_.Name] = $_ } -End { return $ht }
通过作为块-Begin将(开头)执行一次,块传递给-Process将执行一次每管道输入项,与块传递给-End所有的输入已被recevied和处理之后将执行一次。
用你的例子,这看起来像这样:
$ADUserTable = Get-ADUser -Filter * |ForEach-Object -Begin { $ht = @{} } -Process { $ht[$_.SAMAccountName] = $_ } -End { return $ht }
PowerShell 中的每个“cmdlet”都映射到这个 Begin/Process/End 生命周期,因此使用自定义函数概括这个模式很简单:
function New-LookupTable {
param(
[Parameter(Mandatory, ValueFromPipeline)]
[array]$InputObject,
[Parameter(Mandatory)]
[string]$Property
)
begin {
# initialize table
$lookupTable = @{}
}
process {
# populate table
foreach($object in $InputObject){
$lookupTable[$object.$Property] = $object
}
}
end {
return $lookupTable
}
}
并使用如下:
$ADUserTable = Get-ADUser |New-LookupTable -Property SAMAccountName
有关编写高级和启用管道的函数的更多信息,请参阅about_Functions_Advanced文档和相关帮助主题