【问题标题】:PowerShell: Unique Array of ObjectsPowerShell:唯一的对象数组
【发布时间】:2020-12-30 06:46:03
【问题描述】:

我有一组用于团队名称和电子邮件的对象,以及与该团队相关联的票在一个单独的数组中,但是它并没有像预期的那样工作,我已经被这个难住了一段时间......

代码:

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

提前致谢!

【问题讨论】:

    标签: powershell


    【解决方案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 中每个团队只包含一个对象。

    【讨论】:

      猜你喜欢
      • 2017-10-13
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 2022-11-17
      相关资源
      最近更新 更多