在 PowerShell 中,我有一个哈希表列表。我使用了一种Where()
方法来选择列表中的哈希表之一,因为我读到的Where()
速度比Where-Object
. 但是,当我尝试对选定的哈希表进行操作时,我发现它已通过该Where()
方法转换为集合。我无法将其转换回哈希表。
有没有办法让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
. 这没有什么区别。
与cmdlet不同,内部方法始终返回一个集合- 即使输入集合中只有一个元素匹配。
Where-Object
.Where()
顺便说一句:与 不同的是
Where-Object
,通过其可选的第二个参数.Where()
提供了优化:一旦找到第一个匹配项就立即返回,从而使过滤'First'
短路- 下面应用了此优化。不幸的是,
Where-Object
不提供相同的短路是不对称的,这是GitHub 问题 #13834中功能请求的主题。此外,每个匹配元素都被包裹在一个几乎不可见的
[psobject]
包装中。[psobject]
包装器确实会导致行为差异 - 请参阅GitHub 问题 #5579。因此,只需使用索引来提取(唯一)匹配元素,即
[0]
:要排除不可见包装器的潜在副作用
[psobject]
,请使用内在psobject
属性,通过.BaseObject
属性 来提取包装的 .NET 对象: