我在将哈希表添加到多维数组时遇到了麻烦。我编码如下:
$Data = @{BIBs = @(
@{$BIB = @{BIBName=$BIBName},
@{Standort = $Standort},
@{Bücher = @(
@{BuchName = $BuchName;
Autor = $Autor
})
}}
)}
此代码正在运行并创建一个输出,我将其存储在JSON中:
{
"BIBs": [
{
"BIB1": [
{
"BIBName": "123"
},
{
"Standort": "123"
},
{
"Bücher": [
{
"Autor": "123",
"BuchName": "123"
}
]
}
]
},
{
"BIB2": [
{
"BIBname": "345"
},
{
"Standort": "345"
},
{
"Bücher": [
{
"Autor": "345",
"Buchname": "345"
}
]
}
]
}
]
}
我有额外的代码,你可以看到另外一个哈希表添加到数组“BIBs”。
$jsonfile = "C:\Skripte\bibV2-1000.json"
$Data = Get-Content $jsonfile | ConvertFrom-Json
$Data.BIBs += New-Object -TypeName PSObject -Property @{
$BIB = @{BIBname=$BIBName}, @{Standort=$Standort},
@{Bücher = @(@{Buchname=$BuchName;Autor=$Autor})}
}
当输出如上所述时,我无法向“Bücher”添加另一个哈希表。我检查了“Bücher”的类型
$data.BIBs.BIB1.Bücher.GetType()
它实际上是一个数组:
IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array
我试过了
$Data.BIBs.BIB1.Bücher += @{Person="Max";Alter="35"}
添加一个新的哈希表,就像我用“BIB2”,但我得到错误:
The property 'Bücher' cannot be found on this object. Verify that the property exists and can be set. At line:5 char:1 + $data.BIBs.BIB1.Bücher += @{Motor="asdf";pers="345"} + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : PropertyAssignmentException
你知道我如何将@{Person="Max";Alter="35"}
加入“Bücher”吗?
tl;博士
不支持通过成员枚举设置键/属性值(参见下文)。
相反,您必须获取要明确修改其.Bücher
属性的特定对象:
($Data.BIBs.BIB1 | ? Bücher).Bücher += @{ BuchName='neues Buch'; Autor='Johann Doe' }
注意:这假定:
*只有$Data.BIBs.BIB1
数组中的一个元素具有.Bücher
属性(键)
*如果属性/键确实存在,则它是非空的,因此在布尔上下文中是“truthy”,例如传递给?
的表达式(Where-Object
);像成员枚举一样,这个简化的Where-Object
语法 - ? Bücher
而不是? { $_.Bücher }
- 是一个称为比较语句的PSv3 +特性。
Mathias R. Jessen在这个问题的评论中提供了关键指针:
对于获取值与设置值的集合值属性,PowerShell在点符号方面存在故意的不对称性。
不幸的是,当前的错误消息并没有告诉你。 它源于这样的事实:当尝试在集合级别设置属性时,该属性仅直接在集合(而不是其元素)上查找,它通常不存在。
我们来看一个简化的例子:
$data = @{ # a hashtable
a = ( # array of hashtables
@{ b1 = 'b1' },
@{ b2 = 'b2' },
@{ b3 =
@{ b31 = 'b31' }, @{ b32 = 'b32' } # array of hashtables
}
)
}
在获取,一切正常:
PS> $data.a.b3
Name Value
---- -----
b31 b31
b32 b32
尽管$data.a
是一个[object[]]
数组,但在其元素中找到了一个具有属性.b3
的对象(哈希表),并输出该对象的.b3
值。
这是运行中的成员枚举(尽管更典型的用法是属性存在于数组的所有元素上以及在[object[]]
数组中收集各个值的情况)。
在设置时,PowerShell放弃了成员枚举,因此仅在.b3
[object[]]
实例上直接查找$data.a
属性失败,当然,数组没有.b3
属性:
PS> $data.a.b3 += @{ b33 = 'b33' } # Try to add an element; !! FAILS
The property 'b3' cannot be found on this object.
Verify that the property exists and can be set.
...