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
不是 Keys
或 c
条目
补充 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
.
所以,我是 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
不是 Keys
或 c
条目
补充
# 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
.