【问题标题】:PowerShell - How to get the value of PsObject property from an array?PowerShell - 如何从数组中获取 PsObject 属性的值?
【发布时间】:2018-03-31 15:43:24
【问题描述】:

编辑:重新表述问题以更清楚

这是工作代码:

$arr = @(
    @('prop0','name0'),
    @('prop1','name1'),
    @('prop2','name2')
)

$obj = New-Object PsObject
foreach($innerArr in $arr)
{
    $obj | Add-Member -NotePropertyName $innerArr[0] -NotePropertyValue $null
}

$obj2 = New-Object PsObject
$count = 0
foreach($innerArr in $arr)
{
    $value = 'val' + $count
    $obj2 | Add-Member -NotePropertyName $innerArr[1] -NotePropertyValue $value
    $count ++
}

for($i=0; $i -lt $arr.Count; $i++)
{
    # This is what I want to consolidate into one line
    # {
    $prop_name = $arr[$i][1]
    $obj | Add-Member -NotePropertyName $arr[$i][1] -NotePropertyValue $obj2.$prop_name
    # }
}

如何在不将属性名称分配给$prop_name 的情况下执行此操作?

$obj 的输出应如下所示:

PS C:\> $obj
prop0 : 
prop1 : 
prop2 : 
name0 : val0
name1 : val1
name2 : val2

【问题讨论】:

  • 你的第一个数组是一个二元素数组。如果您确切地解释您要解决的问题,也许会有所帮助。
  • @Bill_Stewart 什么?你读过帖子吗? $obj2.$arr[$i][1] 正在杀死它
  • 对不起,我不清楚。什么问题决定了这种数据结构?
  • 你不能按照你的想法去做,因为从那以后它就没有了。您正在将字典变成二维数组
  • 伙计们,我把问题说得更清楚了。对此感到抱歉......我很难说出我的要求

标签: arrays powershell indexing properties


【解决方案1】:

这将使您摆脱错误的部分:

$obj | Add-Member -NotePropertyName $arr[$i][1] -NotePropertyValue $obj2.PSObject.Properties.Item("name$i").value

问题是当 PSobject 不像数组时,您将其视为数组。它更像是一本字典。

键:值

键:值

键:值

由于没有层次结构,因此您必须指定要查找的密钥。

如果我要这样做,我会选择类似的东西

$obj2arr = @($obj2.PSObject.Properties | %{$_})
for($i=0; $i -lt $arr.Count; $i++)
{
     $obj | Add-Member -NotePropertyName $arr[$i][1] -NotePropertyValue $obj2arr[$i].Value
}

将 PSObject 转换为 Items 数组并提取我要使用的属性

自从我在这里回答后您的问题发生了一些变化,因此脚本缩短了

$arr = @(
    @('prop0','name0'),
    @('prop1','name1'),
    @('prop2','name2')
)
$obj = New-Object PsObject
$arr | %{ $obj | Add-Member -NotePropertyName $_[0] -NotePropertyValue $null}
$obj2 = New-Object PsObject
$count = 0
$arr | %{ $obj2 | Add-Member -NotePropertyName $_[1] -NotePropertyValue ('val' + $count); $count++}
$obj2arr = @($obj2.PSObject.Properties | %{$_})
$count = 0
$arr | foreach-object{$obj | Add-Member -NotePropertyName ($_)[1] -NotePropertyValue $obj2arr[$count].Value; $count++}
$obj

【讨论】:

  • 嘿,我给了你一票。我把问题说得更清楚了。我只想将最后一个 for 循环合并到一行,我不知道如何。我觉得没必要先存$prop_name
猜你喜欢
  • 2016-08-02
  • 1970-01-01
  • 2016-10-08
  • 2019-03-15
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 2020-07-27
相关资源
最近更新 更多