J'ai deux tableaux qui ont les objets suivants :

$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"
    },
)

Maintenant, je veux créer un tableau qui a un objet de TagName et pour chaque objet de TagName, il doit contenir une liste de MachineNames séparés par une virgule, donc quelque chose comme ceci :

TagName | MachineName 

ALPHA2    AAA,CCC,EEE

ALPHA0    BBB

ALPHA8    DDD

Voici le code que j'ai essayé:

$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 

    }
}

Mais il ne génère pas de liste de virgules de noms de machines au lieu de cela, il imprime des lignes individuelles pour chaque nom de machine.

1
adi 24 mars 2021 à 21:30

2 réponses

Meilleure réponse

J'itérerais $dataset2 au lieu de $dataset1.

$joined = foreach($row in $dataset2){
    [PSCustomObject]@{
        TagName     = $row.tagname
        MachineName = ($dataset1 | Where-Object id -eq $row.id).MachineName -join ','
    }
}

Si vous essayez d'exclure les entrées dans $dataset1 qui n'ont pas d'entrée correspondante dans $dataset2, modifiez ceci.

$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 ','
    }
}

enter image description here

1
Doug Maurer 24 mars 2021 à 19:15

il ne génère pas de liste de virgules de noms de machines au lieu de cela, il imprime des lignes individuelles pour chaque nom de machine.

C'est en fait un excellent point de départ !

Dirigez simplement les objets résultants vers Group-Object et extrayez les noms de machines de chaque groupe résultant :

$joined |Group-Object TagName |Select Name,@{Name='Machines';Expression = {$_.Group.MachineName -join ','}}

Ce qui devrait vous donner quelque chose comme :

Name   Machines
----   --------
ALPHA2 AAA,CCC,EEE
ALPHA0 BBB
ALPHA8 DDD
1
Mathias R. Jessen 24 mars 2021 à 19:09