如何在 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