如何在 Powershell 中使用逗号列表连接和分组 2 个表?
How to join and group 2 tables with a comma list in Powershell?
我有两个包含以下对象的数组:
$dataset1 = @(
@{
MachineName = "AAA"
ID = "111"
},
@{
MachineName = "BBB"
ID = "222"
},
@{
MachineName = "CCC"
ID = "111"
},
@{
MachineName = "DDD"
ID = "333"
},
@{
MachineName = "EEE"
ID = "111"
}
)
$dataset2 = @(
@{
ID = "111"
TagName = "ALPHA2"
},
@{
ID = "222"
TagName = "ALPHA0"
},
@{
ID = "333"
TagName = "ALPHA8"
},
@{
ID = "444"
TagName = "ALPHA29"
},
)
现在我想创建一个数组,其中有一个 TagName 对象,对于每个 TagName 对象,它应该包含一个用逗号分隔的 MachineNames 列表,如下所示:
TagName | MachineName
ALPHA2 AAA,CCC,EEE
ALPHA0 BBB
ALPHA8 DDD
这是我试过的代码:
$Joined= Foreach ($row in $dataset1)
{
[pscustomobject]@{
ID = $row.ID
MachineName = $row.MachineName -join ','
TagName = $dataset2 | Where-Object {$_.ID -eq $row.ID} | Select-Object -ExpandProperty TagName
}
}
但它不会生成机器名称的逗号列表,而是为每个机器名称打印单独的行。
我会迭代 $dataset2
而不是 $dataset1
。
$joined = foreach($row in $dataset2){
[PSCustomObject]@{
TagName = $row.tagname
MachineName = ($dataset1 | Where-Object id -eq $row.id).MachineName -join ','
}
}
如果您要排除 $dataset1
中那些在 $dataset2
中没有相应条目的条目,请更改为此。
$joined = foreach($row in $dataset2 | Where-Object id -in $dataset1.id){
[PSCustomObject]@{
TagName = $row.tagname
MachineName = ($dataset1 | Where-Object id -eq $row.id).MachineName -join ','
}
}
it is not generating a comma list of Machine names instead it is printing individual rows for each machine name.
这实际上是一个很好的起点!
只需将结果对象通过管道传输到 Group-Object
并从每个结果组中提取机器名称:
$joined |Group-Object TagName |Select Name,@{Name='Machines';Expression = {$_.Group.MachineName -join ','}}
哪个应该给你这样的东西:
Name Machines
---- --------
ALPHA2 AAA,CCC,EEE
ALPHA0 BBB
ALPHA8 DDD
我有两个包含以下对象的数组:
$dataset1 = @(
@{
MachineName = "AAA"
ID = "111"
},
@{
MachineName = "BBB"
ID = "222"
},
@{
MachineName = "CCC"
ID = "111"
},
@{
MachineName = "DDD"
ID = "333"
},
@{
MachineName = "EEE"
ID = "111"
}
)
$dataset2 = @(
@{
ID = "111"
TagName = "ALPHA2"
},
@{
ID = "222"
TagName = "ALPHA0"
},
@{
ID = "333"
TagName = "ALPHA8"
},
@{
ID = "444"
TagName = "ALPHA29"
},
)
现在我想创建一个数组,其中有一个 TagName 对象,对于每个 TagName 对象,它应该包含一个用逗号分隔的 MachineNames 列表,如下所示:
TagName | MachineName
ALPHA2 AAA,CCC,EEE
ALPHA0 BBB
ALPHA8 DDD
这是我试过的代码:
$Joined= Foreach ($row in $dataset1)
{
[pscustomobject]@{
ID = $row.ID
MachineName = $row.MachineName -join ','
TagName = $dataset2 | Where-Object {$_.ID -eq $row.ID} | Select-Object -ExpandProperty TagName
}
}
但它不会生成机器名称的逗号列表,而是为每个机器名称打印单独的行。
我会迭代 $dataset2
而不是 $dataset1
。
$joined = foreach($row in $dataset2){
[PSCustomObject]@{
TagName = $row.tagname
MachineName = ($dataset1 | Where-Object id -eq $row.id).MachineName -join ','
}
}
如果您要排除 $dataset1
中那些在 $dataset2
中没有相应条目的条目,请更改为此。
$joined = foreach($row in $dataset2 | Where-Object id -in $dataset1.id){
[PSCustomObject]@{
TagName = $row.tagname
MachineName = ($dataset1 | Where-Object id -eq $row.id).MachineName -join ','
}
}
it is not generating a comma list of Machine names instead it is printing individual rows for each machine name.
这实际上是一个很好的起点!
只需将结果对象通过管道传输到 Group-Object
并从每个结果组中提取机器名称:
$joined |Group-Object TagName |Select Name,@{Name='Machines';Expression = {$_.Group.MachineName -join ','}}
哪个应该给你这样的东西:
Name Machines
---- --------
ALPHA2 AAA,CCC,EEE
ALPHA0 BBB
ALPHA8 DDD