PowerShell:如何让Where()方法返回哈希表而非集合?
问题:PowerShell中使用Where()方法筛选哈希表列表返回集合而非单个哈希表的解决办法
在PowerShell里我有一个哈希表列表,知道Where()方法比Where-Object快,就用它来筛选特定哈希表,但结果变成了Collection类型,还转不回哈希表。想问有没有办法让Where()直接返回哈希表,实在不行再用Where-Object,但更想继续用Where()找个简便方案。
演示代码
Clear-Host [System.Object[]]$SqlServers = @( @{ key="L"; connectionString="Server=(localdb)\mssqllocaldb;Database=Test;Trusted_Connection=yes;"; }, @{ key="D"; connectionString="Server=DEV.DEV.LOCAL;Database=Test;Trusted_Connection=yes;"; } ) $UserSelection = 'L' $selectedServerDetails = $SqlServers.Where({$_.key -eq $UserSelection}) $selectedServerDetails2 = $SqlServers | Where-Object{$_.key -eq $UserSelection} $selectedServerDetails3 = ($selectedServerDetails -as [hashtable]) $selectedServerDetails.GetType().FullName $selectedServerDetails2.GetType().FullName if ($selectedServerDetails3 -eq $null) { '$selectedServerDetails3 is null' } else { $selectedServerDetails3.GetType().FullName }
运行结果
System.Collections.ObjectModel.Collection`1[[System.Management.Automation.PSObject, System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]] System.Collections.Hashtable $selectedServerDetails3 is null
另外,我尝试将$SqlServers的数据类型改为[hashtable[]]$SqlServers,但没有效果。
解决方案
如果确定筛选结果只有单个哈希表,直接取集合的第一个元素即可:
$selectedServerDetails = $SqlServers.Where({$_.key -eq $UserSelection})[0]这样得到的就是单个哈希表对象,类型为
System.Collections.Hashtable。或者使用
Where()方法的第二个参数指定匹配模式,当只需要第一个匹配项时,传入'First'(或对应的枚举值):# 字符串形式参数 $selectedServerDetails = $SqlServers.Where({$_.key -eq $UserSelection}, 'First') # 枚举值形式(更严谨) $selectedServerDetails = $SqlServers.Where({$_.key -eq $UserSelection}, [System.Management.Automation.WhereOperatorSelectionMode]::First)这个参数会让
Where()直接返回单个匹配对象,而非集合。可选模式还有'Last'(返回最后一个匹配项)、'SkipUntil'等,可根据需求选择。补充说明:将
$SqlServers声明为[hashtable[]]无效的原因是,PowerShell数组的Where()方法默认始终返回Collection<PSObject>类型的集合,和原数组元素类型无关,因此必须通过上述方式提取单个元素或指定匹配模式来获取目标哈希表。
内容的提问来源于stack exchange,提问作者Simon Elms
相关产品推荐
相关产品推荐

