如何从数组向 PowerShell 对象添加属性
How to add properties to a PowerShell object from an array
我有一个包含 属性 个名称和值的 two-dimensional 数组,我需要将其添加到 PowerShell 对象中。
我使用 New-Object and Add-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 将 return 只有一个 属性 成员应该添加,没有任何整齐的列名。
注释掉的部分是出于测试目的而添加的,return 所有项目的正确值。
我也试过了
$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 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
问题是:为什么不呢? Add-Member
中对将值作为变量传递有任何限制吗?空值?
不要执行 For 循环,执行 ForEach-Object 循环。类似于:
$Object = New-Object PSObject
$Array | ForEach{
Add-Member -InputObject $Object -NotePropertyName $_[0] -NotePropertyValue $_[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{}
那样将数据发送到输出流,这值得一提。
您可以使用散列 table 而不是两个数组。从散列 table 创建对象非常容易。这是一个例子:
$hash = @{
ID = '1'
ContentTypeID = '0x0108007345CD807822EA4E85691E5C642F3A27'
ContentType = ''
Title = 'Task0'
Modified = '11/24/2014 12:29:30 PM'
}
$Object = New-Object PSObject -Property $hash
我有一个包含 属性 个名称和值的 two-dimensional 数组,我需要将其添加到 PowerShell 对象中。
我使用 New-Object and Add-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 将 return 只有一个 属性 成员应该添加,没有任何整齐的列名。
注释掉的部分是出于测试目的而添加的,return 所有项目的正确值。
我也试过了
$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 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
问题是:为什么不呢? Add-Member
中对将值作为变量传递有任何限制吗?空值?
不要执行 For 循环,执行 ForEach-Object 循环。类似于:
$Object = New-Object PSObject
$Array | ForEach{
Add-Member -InputObject $Object -NotePropertyName $_[0] -NotePropertyValue $_[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{}
那样将数据发送到输出流,这值得一提。
您可以使用散列 table 而不是两个数组。从散列 table 创建对象非常容易。这是一个例子:
$hash = @{
ID = '1'
ContentTypeID = '0x0108007345CD807822EA4E85691E5C642F3A27'
ContentType = ''
Title = 'Task0'
Modified = '11/24/2014 12:29:30 PM'
}
$Object = New-Object PSObject -Property $hash