PowerShell: Уникальный массив объектов

#powershell

#powershell

Вопрос:

У меня есть массив объектов для названий команд и электронных писем, а также билетов, связанных с этой командой, в отдельном массиве, однако он работает не совсем так, как ожидалось, и я какое-то время был в тупике по этому поводу…

код:

 $teamConfig = @(
    [pscustomobject]@{
        TeamName='Team1';
    }
)

$query = "select * from INCAutomation"

$results = Invoke-Sqlcmd -query $query -ServerInstance 'localhost' -Database 'AyushTest'

$collectionWithItems = @()
$array = @()

foreach ($i in $results) {
    foreach ($x in $teamConfig) {
        if ($i.TeamName -eq $x.TeamName) {
            $array  = $i.TicketID

            $temp = New-Object System.Object
            $temp | Add-Member -MemberType NoteProperty -Name "TeamName" -Value $i.TeamName
            $temp | Add-Member -MemberType NoteProperty -Name "TeamEmail" -Value $i.TeamEmail
            $temp | Add-Member -MemberType NoteProperty -Name "TicketID" -Value $array
            $collectionWithItems  = $temp
        }
    }
}

$collectionWithItems = $collectionWithItems | select 'TeamName', 'TeamEmail', 'TicketID' -Unique

$collectionWithItems
 

Вывод:

 TeamName TeamEmail      TicketID
-------- ---------      --------
Team1    Team1@test.com {INC0001}
Team1    Team1@test.com {INC0001, INC0002}
Team1    Team1@test.com {INC0001, INC0002, INC0003}
Team1    Team1@test.com {INC0001, INC0002, INC0003, INC0004}
 

Желаемый результат:

 TeamName TeamEmail      TicketID
-------- ---------      --------
Team1    Team1@test.com {INC0001, INC0002, INC0003, INC0004}
 

Другая вещь, которая меня также смущает, это то, что для этого нужно будет работать, например, с несколькими командами:

 $teamConfig = @(
    [pscustomobject]@{
        TeamName='Team1';
    }
    [pscustomobject]@{
        TeamName='Team2';
    }
    [pscustomobject]@{
        TeamName='Team3';
    }
)
 

и в результате желаемый результат должен быть:

 TeamName TeamEmail      TicketID
-------- ---------      --------
Team1    Team1@test.com {INC0001, INC0002, INC0003, INC0004}
Team2    Team2@test.com {INC0005, INC0006, INC0007, INC0008}
Team3    Team3@test.com {INC0009, INC0010, INC0011, INC0012}
 

Заранее спасибо!

Ответ №1:

Ваш внешний цикл должен повторяться $teamConfig так, чтобы вы проходили через каждую команду только один раз.

Чтобы получить билеты, связанные с текущим названием команды, вы можете использовать Where-Object , например, так:

 $ticketIds = $results |Where-Object TeamName -eq $team.TeamName |Select -ExpandProperty TicketID
 

Это позволяет вам значительно упростить ваш код:

 $teamConfig = @(
    [pscustomobject]@{
        TeamName  = 'Team1'
        TeamEmail = 'team1@domain.tld'
    }
    [pscustomobject]@{
        TeamName  = 'Team2'
        TeamEmail = 'team2@domain.tld'
    }
    [pscustomobject]@{
        TeamName  = 'Team3'
        TeamEmail = 'team3@domain.tld'
    }
)

$query = "select * from INCAutomation"

$results = Invoke-Sqlcmd -query $query -ServerInstance 'localhost' -Database 'AyushTest'

$teamTickets = foreach($team in $teamConfig){
  # Filter tickets based on team name
  $ticketIds = $results |Where-Object TeamName -eq $team.TeamName |Select -ExpandProperty TicketID

  # Output a single object per team, with all ticket IDs attached
  $team |Select TeamName,TeamEmail,@{Name='TicketID';Expression={ $ticketIds }}
}
 

$teamTickets теперь содержит ровно один объект на команду $teamConfig .