我从PowerShell命令获得以下输出,并想更新EmployeeID的值
我可以用$test.identifiers | where {$_.name -like "EmployeeID" }
过滤输出
但是,如果我尝试使用
更新值$test.identifiers | where {$_.name -like "EmployeeID" } | foreach {$_.values.value = "098324"}
如何更新此嵌套值?
答案 0 :(得分:2)
$_.values
包含一个 array (或集合)对象,这说明了为什么您可以获取(读取).value
属性的原因,但不能设置(写)(请参见下文)。
如果您希望数组只有一个 个元素,只需使用[0]
直接访问该元素:
$test.identifiers | where {$_.name -like "EmployeeID" } | foreach {
$_.values[0].value = '098324'
}
如果有多个 元素,请使用
$_.values | foreach { $_.value = '098324' }
分配给所有人,或者在PSv4 +中分配给他们,
$_.values.ForEach('value', '098324')
在PSv3 +中,称为 member enumeration 的功能使您可以访问集合上的属性,并获得单个中的属性值元素作为数组返回。
但是,该仅适用于获取属性,不适用于设置这些属性。
当您尝试设置时,仅考虑集合的 own 属性,这说明了您看到的错误-数组本身没有.value
属性。
this asymmetry is by design 时,为避免潜在的批量修改,该错误消息肯定会更有帮助。
问题的简单再现:
创建一个属性为one
的对象,其中包含一个带有单个对象的 array 以及另一个对象,属性为two
:
$obj = [pscustomobject] @{ one = , [pscustomobject] @{ two = 2 } }
默认输出如下:
PS> $obj
one
---
{@{two=2}}
外面的{...}
表示一个 array ,就像您的情况一样,里面是一个
PowerShell用于表示自定义对象的hashtable- like 表示法。
获取嵌套内部数组对象的two
属性按预期工作:
PS> $obj.two
2
尝试设置失败 :
PS> $obj.two = 2.1
The property 'two' cannot be found on this object. Verify that the property exists and can be set.
要设置,请使用.ForEach()
,例如:
PS> $obj.ForEach('two', 2.1); $obj
one
---
{@{two=2.1}}
答案 1 :(得分:0)
您是否用完整的对象路径尝试过这种方式:
$test.identifiers | where {$_.name -like "EmployeeID" } | foreach {$_.identifiers.values.value = "098324"}