PowerShell更新嵌套值

PowerShell更新嵌套值,powershell,Powershell,我有来自PowerShell命令的以下输出,希望更新EmployeeID的值 我可以使用$test.identifiers |其中{$\uu.name-like“EmployeeID”} 但是如果我尝试用 $test.identifiers | where {$_.name -like "EmployeeID" } | foreach {$_.values.value = "098324"} 我犯了一个错误 如何更新此嵌套值?您是否用完整对象路径尝试过这种方法: $test.ident

我有来自PowerShell命令的以下输出,希望更新EmployeeID的值

我可以使用
$test.identifiers |其中{$\uu.name-like“EmployeeID”}

但是如果我尝试用

$test.identifiers | where {$_.name -like "EmployeeID" } | foreach {$_.values.value = "098324"} 
我犯了一个错误


如何更新此嵌套值?

您是否用完整对象路径尝试过这种方法:

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

$\uValues
包含一个数组(或集合)对象,这解释了为什么可以获取(读取)
.value
属性,但不能设置(写入)它(请参见下文)

如果希望数组只有一个元素,只需使用
[0]
直接访问该元素:

$test.identifiers | where {$_.name -like "EmployeeID" } | foreach {
  $_.values[0].value = '098324'
} 
如果有多个元素,请使用
$\.values | foreach{$\.values='098324'}
将它们全部分配给它们,或者,在PSv4+中,
$\u.values.ForEach('value','098324')


在PSv3+中,名为的功能允许您访问集合上的属性,并将单个元素的属性值作为数组返回

但是,仅用于获取属性,而不用于设置属性

当您尝试设置时,只考虑集合自己的属性,这解释了您看到的错误-数组本身没有
.value
属性

虽然,但为了避免可能不需要的批量修改,错误消息肯定会更有帮助


问题的简单再现

创建一个具有属性
one
的对象,该属性包含具有另一个属性
two
的单个元素数组:

$obj = [pscustomobject] @{ one = , [pscustomobject] @{ two = 2 } }
默认输出如下所示:

PS> $obj

one
---
{@{two=2}}
外部的
{…}
表示一个数组,就像在您的例子中一样,内部是一个数组 PowerShell用于表示自定义对象的类似哈希表的符号

获取嵌套在数组对象的
two
属性中的值可以按预期工作:

PS> $obj.two
2
尝试设置失败:

要设置,请使用
.ForEach()
,例如:

PS> $obj.ForEach('two', 2.1); $obj

one
---
{@{two=2.1}}

…|foreach{$\u.name=“098324”}
查找哈希表中的内容……我构建了一个小哈希表来说明如何获取数据:$x=@{id='1';value='123';isObfuscated=“False”}$x[‘值’]$x['id']@iRon,用于更改名称而不是value@Tom获取数据不是$test.identifiers.values.value的问题。但是更新这些值是我试图避免的,如果你像这样把$test.identifiers.values['value']=“098324”当作一个哈希表来处理,它会起作用吗。给出错误:在此对象上找不到属性“value”。验证该属性是否存在并且可以设置。
foreach
foreach Object
)脚本块中的
$\code>表示当前正在枚举的输入集合
$test.identifiers
的元素,因此使用
$\identifiers
是不正确的。谢谢!谢谢你的广泛回答$test.identifiers |其中{$\.name-like“EmployeeID”}foreach{$\.values.foreach('value','098324')}是骗子听到的@MisterIks;我的荣幸。
PS> $obj.ForEach('two', 2.1); $obj

one
---
{@{two=2.1}}