如何从数组向PowerShell对象添加属性

gri*_*sha 7 powershell properties object powershell-ise

我有一个属性名称和值的二维数组,我需要添加到PowerShell对象.

使用New-ObjectAdd-Member创建和显示这样的对象没有任何问题:

$obj = New-Object PSObject
$obj | Add-Member NoteProperty IName($fiel.IName)
$obj | Add-Member NoteProperty SName($fiel.SName)
$obj | Add-Member NoteProperty Taggy($fiel.Taggy)
$obj | Add-Member NoteProperty Title($fiel.Title)

Write-Output $obj
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是,当我尝试这样的事情时:

for ($k=0; $k -lt $fieldsArray.Count; $k++)
{
    $itemobj | Add-Member –MemberType NoteProperty –Name $fieldsArray[$k].InternalName –Value $itemki[$j][$fieldsArray[$k].InternalName]
    #Write-Host $k
    #Write-Host $fieldsArray[$k].InternalName.ToString()
    #Write-Host $itemki[$j][$fieldsArray[$k].InternalName]
}

Write-Output $itemobj
Run Code Online (Sandbox Code Playgroud)

Write-Output $ itemobj将只返回一个应该添加的属性成员而没有任何整齐的列名.
添加了注释掉的部分用于测试目的并返回所有项目的正确值.

我也试过了

$itemobj | Add-Member NoteProperty $fieldsArray[$k].InternalName.ToString()($fieldsArray[$k].InternalName)
Run Code Online (Sandbox Code Playgroud)

没有任何改进.

为什么没有添加其他房产成员?

我有我需要的数据.如果我写:

for ($k=0; $k -lt $fieldsArray.Count; $k++)
{
    Write-Host $k
    Write-Host $fieldsArray[$k].InternalName.ToString()
    Write-Host $itemki[$j][$fieldsArray[$k].InternalName]
}
Run Code Online (Sandbox Code Playgroud)

我明白了:

0 ID 1
1 ContentTypeId 0x0108007345CD807822EA4E85691E5C642F3A27
2 ContentType
3 Title Task0
4 Modified 11/24/2014 12:29:30 PM

这些正是我期望和想要的价值观.问题是将它们作为属性添加到对象.我想我不能把变量作为一个变量NotePropertyName,但根据我得到的结果,这是一个疯狂的猜测.

$ itemki [$ j] [$ fieldsArray [$ k] .InternalName]中的一些值为空 - 可能是它吗?

忘记所有数组.他们只是为了上下文:

Write-Host $fieldsArray[$k].InternalName.ToString() # Writes out the correct value
Write-Host $itemki[$j][$fieldsArray[$k].InternalName] # writes out the correct value
$itemobj | Add-Member NoteProperty $fieldsArray[$k].InternalName.ToString()($fieldsArray[$k].InternalName) # The values/property are not added
Run Code Online (Sandbox Code Playgroud)

问题是:为什么不呢?Add-Member将值作为变量传递是否有任何限制?空值?

Mat*_*att 12

我仍然不完全确定,但如果你只是专注于Add-Member那么考虑以下.

$fieldsarray = "ID", "ContentTypeID", "ContentType", "Title", "Modified"
$itemki = "1", "0x0108007345CD807822EA4E85691E5C642F3A27", "", "Task0", "11/24/2014 12:29:30 PM"
$itemobj = New-Object pscustomobject
for($k=0;$k -lt $fieldsArray.Count ; $k++)
{
    $itemobj | Add-Member NoteProperty $fieldsarray[$k] $itemki[$k]
}

$itemobj
Run Code Online (Sandbox Code Playgroud)

注意数组中的空字符串条目$itemki.这将生成输出.

ID            : 1
ContentTypeID : 0x0108007345CD807822EA4E85691E5C642F3A27
ContentType   :
Title         : Task0
Modified      : 11/24/2014 12:29:30 PM
Run Code Online (Sandbox Code Playgroud)

将其更改""为空元素:"1","0x0108007345CD807822EA4E85691E5C642F3A27",,"Task0","11/24/2014 12:29:30 PM",您将获得此输出:

ID            : 1
ContentTypeID : 0x0108007345CD807822EA4E85691E5C642F3A27
ContentType   : {Task0}
Title         : 11/24/2014 12:29:30 PM
Modified      :
Run Code Online (Sandbox Code Playgroud)

哪个错了.然后,如果您将空元素更改为$null您的输出看起来很像第一个:

ID            : 1
ContentTypeID : 0x0108007345CD807822EA4E85691E5C642F3A27
ContentType   :
Title         : Task0
Modified      : 11/24/2014 12:29:30 PM
Run Code Online (Sandbox Code Playgroud)

关于你的输出

你说当你$itemobj在循环之外做时,你只得到最后一个元素.$itemobj每次通过后看起来像什么?for(;;){}循环不会以与ForEach-Object{}值得一提的方式相同的方式将数据发送到输出流.

  • 我希望你就你的决议是什么发表评论.我不认为这是一个很好的答案......至少现在还没有. (3认同)

The*_*ian 7

不要做 For 循环,做一个 ForEach-Object 循环。就像是:

$Object = New-Object PSObject
$Array | ForEach{
    Add-Member -InputObject $Object -NotePropertyName $_[0] -NotePropertyValue $_[1]
}
Run Code Online (Sandbox Code Playgroud)

那应该做你正在寻找的我认为。

  • 赞成,因为即使它不能解决问题,但它确实提高了代码的质量 (2认同)

cam*_*.rw 7

您可以使用哈希表而不是两个数组。从哈希表创建对象非常容易。下面是一个例子:

$hash = @{
    ID            = '1'
    ContentTypeID = '0x0108007345CD807822EA4E85691E5C642F3A27'
    ContentType   = ''
    Title         = 'Task0'
    Modified      = '11/24/2014 12:29:30 PM'
}

$Object = New-Object PSObject -Property $hash
Run Code Online (Sandbox Code Playgroud)