我有一个自定义对象,其中包含看起来像这样的设备信息。
name,model,sn
PC1,Elitebook 850, ABC123,
PC2,EliteDesk 600,123ABC
我具有检索防病毒产品检测到的威胁的功能。这些作为对象数组返回。属性比下面更多,但这仅是示例
file,md5
bad.exe,adfdfdfd
evil.exe,fdfdffdf
我想将每个成员作为属性添加到自定义对象,以便最终输出与此类似。
name,model,sn,01_file,01_md5,02_file,02_md5
当前,我的脚本执行此操作:
foreach($device in $devices){
$threats = Get-Threats $device
[pscustomobject] @{
name = $device.device_name
make = $device.make
sn = $device.sn
ThreatFileName = $threats.File -join ", "
Threat_md5 = $threats.md5 -join ", "
}
}
这行得通,但是我真的希望由“获取威胁”函数返回的每个对象都被列为自己的一组属性。我需要动态生成此文件,因为我不知道每个设备将返回多少威胁。
关于如何解决此问题的任何想法?
答案 0 :(得分:3)
您可以随时使用Add-Member
cmdlet向对象添加属性。也许从一个空对象开始,遍历Get-Threats返回的元素,每次添加一个成员?
编辑:示例代码以供参考。
$o = [pscustomobject]@{
MemberA='aaa'
MemberB='bbb'
MemberC='ccc'
MemberD='ddd'
}
"Before"
$o | ft
$o | Add-Member -MemberType NoteProperty -Name 'MemberE' -Value 'eee'
$o | Add-Member -MemberType NoteProperty -Name 'MemberF' -Value 'fff'
"After"
$o | ft
答案 1 :(得分:0)
@krome的回答使我指出了正确的方向,尽管该回答对我而言不起作用,因为每个设备可能存在多种威胁。
我使用了Dynamically get PSCustomObject property and values上@scobi的答案来得出这个答案,该答案满足了我动态生成新属性的要求。
foreach($device in $devices){
$threats = Get-Threats $device
if($null -ne $threats){
$i = 1
foreach($threat in $threats){
$threat | Get-Member -MemberType NoteProperty | % Name | %{
Add-Member -InputObject $device -NotePropertyName ("Threat"+$i.ToString() + "_" + $_) -NotePropertyValue $threat.$_ -Force
}
$i++
}
}
}
Write-Output $devices
devices
数组中的每个设备并调用我的
Get-Threats
功能。if
语句可防止任何设备运行循环
没有威胁。$i
用作我的计数器,以增加每个属性的名称
发现威胁,因此属性都将具有唯一的名称Get-Member
的所有威胁管道以进行检索
属性名称和值device
,使用计数器为每个属性指定一个唯一的名称