【问题标题】:How to add properties to a PowerShell object from an array如何将属性从数组添加到 PowerShell 对象
【发布时间】:2015-03-06 22:39:43
【问题描述】:

我有一个属性名称和值的二维数组,我需要将其添加到 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

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

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

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

我也试过

$itemobj | Add-Member NoteProperty $fieldsArray[$k].InternalName.ToString()($fieldsArray[$k].InternalName)

没有任何改进。

为什么没有添加其他属性成员?

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

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

我明白了:

0 ID 1
1 ContentTypeId 0x0108007345CD807822EA4E85691E5C642F3A27
2 ContentType
3 标题任务 0
4 已于 2014 年 11 月 24 日下午 12:29:30 修改

而这些正是我所期望和想要的价值观。问题是将它们作为属性添加到对象中。我认为我不能将变量作为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

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

【问题讨论】:

  • 代码 sn-ps 缺少数据,因此很难看出您要实现的目标。请考虑发布Minimal, Complete, and Verifiable example
  • 这似乎是一个问题,因为您使用了不同的参数集。在第一个示例中,您使用的是NotePropertySingleMemberSet,但在第二个示例中,您使用的是MemberSet
  • 如果我们有一些样本数据,我们肯定可以告诉您哪里出了问题。你没有告诉我们 $j$itemobj 是在哪里声明的,但我想我们可以猜到
  • 我承认我仍然对这个问题感到困惑。很明显,这里的信息来自 SharePoint,但第一个示例似乎与第二个示例无关。首先,您使用的是自定义函数IName,SName...,根据图片,没有您从编辑中显示的所有预期输出。在您的第二个示例中,$fieldsarray 看起来像这样:="ID","ContentTypeID","ContentType","Title","Modified"? $itemki 的结构也让我不得不猜测其中的数据。没有更多信息就不会得到这个。可能只是我。

标签: object powershell properties powershell-ise


【解决方案1】:

我仍然不能完全确定,但如果您只关注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

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

ID            : 1
ContentTypeID : 0x0108007345CD807822EA4E85691E5C642F3A27
ContentType   :
Title         : Task0
Modified      : 11/24/2014 12:29:30 PM

"" 更改为空元素:"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      :

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

ID            : 1
ContentTypeID : 0x0108007345CD807822EA4E85691E5C642F3A27
ContentType   :
Title         : Task0
Modified      : 11/24/2014 12:29:30 PM

关于你的输出

您说只有在循环外执行$itemobj 时才能获得最后一个元素。每次通过后$itemobj 是什么样的? for(;;){} 循环不会像 ForEach-Object{} 那样将数据发送到输出流,这一点值得一提。

【讨论】:

  • 我希望您对您的解决方案发表评论。我认为这不是一个好的答案……至少现在还没有。
【解决方案2】:

不要执行 For 循环,执行 ForEach-Object 循环。比如:

$Object = New-Object PSObject
$Array | ForEach{
    Add-Member -InputObject $Object -NotePropertyName $_[0] -NotePropertyValue $_[1]
}

我认为这应该可以满足您的需求。

【讨论】:

  • 赞成,因为即使它没有解决问题,它确实提高了代码的质量
  • 示例代码中不应该有“ForEach-Object”吗?
  • 好的,根据the documentation for ForEach-Object,ForEach(和“%”)是一个别名,所以应该没有任何区别。但是你为什么说“不要做一个 ForEach 循环,做一个 ForEach-Object 循环”呢?
  • 对不起,我已经习惯了输入ForEach,所以我输入了它而不是For。我已经更新了我的答案。
【解决方案3】:

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

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

$Object = New-Object PSObject -Property $hash

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 2012-07-01
    • 2019-08-21
    • 1970-01-01
    • 2010-10-07
    • 2018-02-19
    相关资源
    最近更新 更多