Powershell 如何从包含“0”的哈希表中检索所有键;“钥匙”;及;价值观;文本?
在PowerShell中,您可以使用Powershell 如何从包含“0”的哈希表中检索所有键;“钥匙”;及;价值观;文本?,powershell,syntax,properties,key,hashtable,Powershell,Syntax,Properties,Key,Hashtable,在PowerShell中,您可以使用键属性从哈希表获取所有键: $ht=@{ "1"="10"; "2"="20"; } $ht.Keys 这将返回: 2 1 但这是: $ht=@{ "Keys"="Keys text"; "text1"="text1111" } $ht.Keys 将返回键文本(键项的值) 有没有办法强制.Keys返回Keys属性而不是Keys项的值?这似乎是一个错误,因为检索键的语法正在取代哈希表的Keys属性,尽管我可以看到有人期望它的
键
属性从哈希表
获取所有键:
$ht=@{
"1"="10";
"2"="20";
}
$ht.Keys
这将返回:
2
1
但这是:
$ht=@{
"Keys"="Keys text";
"text1"="text1111"
}
$ht.Keys
将返回键文本
(键项的值)
有没有办法强制
.Keys
返回Keys
属性而不是Keys
项的值?这似乎是一个错误,因为检索键的语法正在取代哈希表的Keys
属性,尽管我可以看到有人期望它的任何一种行为。根据GitHub上的问题,这是一个bug,但需要进行突破性的更改才能纠正,因此下面的解决方法已添加到文档中
根据:
如果键名与哈希表类型的某个属性名冲突,则可以使用PSBase
访问这些属性。例如,如果密钥名称为keys
,并且希望返回密钥集合,请使用以下语法:
$hashtable.PSBase.Keys
您还可以通过反射检索属性值
PS> $ht.GetType().GetProperty('Keys').GetValue($ht)
text1
Keys
谢谢。我从($ht.Keys.GetEnumerator()| Select Object-Unique)-join,“;”之类的东西中得到了一些奇怪的结果。就像什么!这是从哪里来的?.原来这个令人毛骨悚然的东西我第一次尝试也是使用.GetEnumerator()
,但结果是枚举键
项的字符串
值,而不是键
属性。啊,@Nas得到了它。您需要在$ht
上调用GetEnumerator()
,而不是$ht.Keys
。太近了,可能是虫子。它应该是:$ht.Values返回值属性和$ht。“Values”返回项值。我发现一个PowerShell GitHub问题引用了此行为和解决方法,我已将其添加到我的答案中。还有一个可能性$ht.GetEnumerator()。Name
谢谢。看来没有办法强迫它。类似于{I want my Keys/Values}$ht.Values的内容说明Select Object-ExpandProperty
仅在Windows PowerShell中有效。在PowerShell核心中,@{foo='bar';Keys='baz'}选择对象-ExpandProperty Keys
生成baz
,而不是键的集合。相比之下,$ht.GetEnumerator().Name
(在PSv3+中)在这两个版本中都可以使用,但是请注意,使用.Key
而不是.Name
将不起作用,也不会使用.Value
来获取值集合,原因在感谢中解释,@PetSerAl。我已经整理了以前的评论,并发布了一个摘要。我明白你关于术语属性的观点,但是如果我猜的话,一般的PowerShell用户都认为@{foo='bar';Keys='baz'}.Keys
中的.Keys
也是属性访问,这不仅仅是因为语法相同。
$ht | Select-Object -ExpandProperty Keys