PowerShell更新嵌套值

时间:2018-08-23 17:07:51

标签: powershell

我从PowerShell命令获得以下输出,并想更新EmployeeID的值 Unfiltered output

我可以用$test.identifiers | where {$_.name -like "EmployeeID" }过滤输出 Filtered output

但是,如果我尝试使用

更新值
$test.identifiers | where {$_.name -like "EmployeeID" } | foreach {$_.values.value = "098324"} 

我收到一个错误 Error

如何更新此嵌套值?

2 个答案:

答案 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"}