Powershell .value 与 .values

Ton*_*ony 1 powershell dictionary

我有一个返回 DictionaryEntry 集合的脚本,我注意到如果该字典恰好只有一个 K/V 对,我必须指定 var.value 与如果它有多个 var.values !是什么赋予了?有没有通用的方法来解决这个问题?在一个命令中?

mkl*_*nt0 6

如果该字典恰好只有一对 K/V 对,我必须指定 var.value

否:这意味着您正在处理一个孤立的键值对或此类对的(非字典)集合(数组),例如[System.Collections.DictionaryEntry]实例,它们不属于(单个)字典(哈希表) :

# Single key-value pair
$kvPair = [System.Collections.DictionaryEntry]::new('foo', 42)
$kvPair.Value # -> 42

# Array of key-value pairs
(
  [System.Collections.DictionaryEntry]::new('foo', 42), 
  [System.Collections.DictionaryEntry]::new('bar', 43)
).Value # -> 42, 43
Run Code Online (Sandbox Code Playgroud)

事实上,它甚至适用于键值对的.Value(类似数组)集合.Value(即使是该集合的各个元素的属性),这要归功于 PowerShell 的成员访问枚举功能。


相比之下,是字典(哈希表)对象.Values的类型本机属性。这样的对象包含一个(通常是无序的)具有不同键的键值对的内部集合,属性将其值作为集合返回;使用文字作为示例:.Values[hashtable]

# Single-entry hashtable.
@{ foo = 42 }.Values # -> @(42) (single-element collection)

# Multi-entry hashtable.
@{ foo = 42; bar = 43 }.Values # -> 42, 43
Run Code Online (Sandbox Code Playgroud)

但请注意,与成员访问枚举不同,该.Values属性始终返回一个集合,即使该集合恰好只包含一个元素。

PowerShell 将字典/哈希表视为单个对象,这有两个含义:

  • 它被作为一个整体发送到管道。

    • 要请求一一发送其条目(键值对),您必须.GetEnumerator()显式调用。
  • 应用成员访问枚举,因此.Value不能用于返回各个条目的.Value属性值。

    • 相反,请使用 type-native.Values属性,如上所示(或.Keys,获取键的集合)。