PowerShell - 如何从数组中获取PsObject属性的值?

时间:2017-10-19 14:45:38

标签: arrays powershell indexing properties

修改:修改问题更清晰

以下是工作代码:

$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

1 个答案:

答案 0 :(得分: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