PowerShell 中字典中的字典

A dictionary inside of a dictionary in PowerShell

所以,我是 PowerShell 的新手,只是不知道如何使用 arrays/lists/hashtables。我基本上想做 Python 所描绘的以下内容:

entries = {
    'one' : {
        'id': '1',
        'text': 'ok'
    },
    'two' : {
        'id': '2',
        'text': 'no'
    }
}

for entry in entries:
    print(entries[entry]['id'])

输出:

1

2


但这在 PowerShell 中如何工作?我试过以下方法:

$entries = @{
    one = @{
        id = "1";
        text = "ok"
    };
    two = @{
        id = "2";
        text = "no"
    }
}

现在我不知道如何访问这些信息。

foreach ($entry in $entries) {
   Write-Host $entries[$entry]['id']
}

=> Error

PowerShell 防止对字典进行隐式迭代以避免意外“展开”。

您可以解决此问题并通过显式调用 GetEnumerator() 来遍历包含的 key-value 对:

foreach($kvp in $entries.GetEnumerator()){
    Write-Host $kvp.Value['id']
}

对于更接近 python 示例的内容,您还可以提取键值并迭代这些值:

foreach($key in $entries.get_Keys()){
    Write-Host $entries[$key]['id']
}

注意:您会发现迭代 $entries.Keys 也有效,但我强烈建议 永远不要 使用它,因为 PowerShell 通过 [=36= 解析字典键] 访问,所以如果字典包含一个带有键 "Keys":

的条目,你会得到意想不到的行为
$entries = @{
    Keys = 'a','b'
    a = 'discoverable'
    b = 'also discoverable'
    c = 'you will never find me'
}

foreach($key in $entries.Keys){ # suddenly resolves to just `'a', 'b'`
    Write-Host $entries[$key]
}

您只会看到输出:

discoverable
also discoverable

不是 Keysc 条目

补充 with a more concise alternative that takes advantage of member-access enumeration

# Implicitly loops over all entry values and from each 
# gets the 'Id' entry value from the nested hashtable. 
$entries.Values.Id  # -> 2, 1

注意:与 .Keys 对比 .get_Keys() 一样,您可以选择常规使用 .get_Values() 而不是 .Values 以避免键问题字面上命名为 Values.