Powershell 如何从包含“0”的哈希表中检索所有键;“钥匙”;及;价值观;文本?

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属性,尽管我可以看到有人期望它的

在PowerShell中,您可以使用
属性从
哈希表
获取所有键:

$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