#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
.