![](/img/trans.png)
[英]How add hash-tables in array and retrieve value from key in hash-table? Powershell
[英]How to add an array of hash tables to an array powershell
我正在尝试将哈希表数组添加到 Powershell 中的现有哈希表数组,添加单个项目工作正常但我似乎无法找到如何将多个哈希表添加到现有数组。
例如我有以下内容;
$ToAdd = @()
$ToAdd += (@{
id = "1234";
type = "Scope";
})
然后我希望能够将哈希表的 $ToAdd 数组添加到下面的 object ($helloBody.helloAccess.AccessRequired)
$HelloBody = [ordered] @{
"helloAccess" = @(
@{
hello = "hello"
accessRequired = @(
@{
id = "random guid"
type = "item 123"
}
)
}
)
}
如何将哈希表数组添加到另一个数组中?
当我尝试$helloBody.helloAccess.AccessRequired += $ToAdd
时,出现以下错误:
A hash table can only be added to another hash table.
为了更新嵌套哈希表的.accessRequired
条目,您必须避免成员访问枚举:
在您的情况下,这意味着您必须显式访问存储在.helloAccess
中的数组的第一个元素:
$helloBody.helloAccess[0].AccessRequired += $ToAdd
省略[0]
不起作用,因为成员访问枚举(遗憾的是)解包了一个单元素数组,而不是像这样报告它。
具体来说:
$helloBody.helloAccess
对存储在该属性中的单元素数组执行成员访问枚举,并从每个元素返回AccessRequired
条目。
唯一的.AccessRequired
条目本身是一个单元素数组,成员访问枚举解开该单元素数组,直接产生它的唯一元素,即哈希表。
+=
/ +
只有当操作数也是一个哈希表时,哈希表才有效,在这种情况下,条目被合并; 使用任何其他类型作为操作数会导致您看到的错误(错误消息有点令人困惑,但这正是它试图告诉您的)。
笔记:
成员访问枚举解包单个元素 arrays,因为它模拟了管道中ForEach-Object
cmdlet 的行为,就像 cmdlet 通常所做的那样,通过枚举将对象一个一个地发射到管道,以便Write-Output -NoEnumerate @('foo') | ForEach-Object { $_ }
Write-Output -NoEnumerate @('foo') | ForEach-Object { $_ }
产生与'foo' | ForEach-Object { $_ }
'foo' | ForEach-Object { $_ }
:单元素数组被视为其唯一元素,并且数组包装器丢失。
更一般地说,请注意,您只能使用成员访问枚举来获取属性值,而不能用于设置它们:
例如,以下失败:
# ERROR: "The property 'foo' cannot be found on this object..." @(@{ foo = 1 }, @{ foo = 2 }).foo = 42
但是,由于展开行为,如果结果恰好只是一个 object,则更新该单个object 的属性恰好有效(这就是为什么您的分配原则上有效,但由于操作数不兼容而失败):
# OK, but only because the single-element array wrapper # is effectively ignored. @(@{ foo = @{ bar = 1 } }).foo.bar = 42
防止设置被认为是设计使然,以防止无意的更改; 无论哪种方式,错误消息都令人困惑 - 请参阅GitHub 问题 #5271以获取讨论和解决方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.