Public/Core/Teams/Get-AdoTeam.ps1

function Get-AdoTeam {
    <#
    .SYNOPSIS
        Retrieves Azure DevOps team details.
 
    .DESCRIPTION
        This cmdlet retrieves details of one or more Azure DevOps teams within a given project.
        You can retrieve all teams in a project, or specific teams by name or ID.
 
    .PARAMETER CollectionUri
        Optional. The collection URI of the Azure DevOps collection/organization, e.g., https://dev.azure.com/my-org.
 
    .PARAMETER ProjectName
        Optional. The ID or name of the project. If not specified, the default project is used.
 
    .PARAMETER Name
        Optional. The ID or name of the team(s) to retrieve. If not provided, retrieves all teams.
 
    .PARAMETER Skip
        Optional. The number of teams to skip. Used for pagination when retrieving all teams.
 
    .PARAMETER Top
        Optional. The number of teams to retrieve. Used for pagination when retrieving all teams
 
    .PARAMETER Version
        Optional. The API version to use for the request. Default is '7.1'.
 
    .LINK
        https://learn.microsoft.com/en-us/rest/api/azure/devops/core/teams/get
        https://learn.microsoft.com/en-us/rest/api/azure/devops/core/teams/get-teams
 
    .EXAMPLE
        $params = @{
            CollectionUri = 'https://dev.azure.com/my-org'
            ProjectName = 'my-project-1'
        }
        Get-AdoTeam @params
 
        Retrieves all teams from the specified project.
 
    .EXAMPLE
        $params = @{
            CollectionUri = 'https://dev.azure.com/my-org'
            ProjectName = 'my-project-1'
        }
        Get-AdoTeam @params -Name 'my-team'
 
        Retrieves the specified team from the project.
 
    .EXAMPLE
        $params = @{
            CollectionUri = 'https://dev.azure.com/my-org'
            ProjectName = 'my-project-1'
        }
        'team-1' | Get-AdoTeam @params -Verbose
 
        Retrieves a team demonstrating pipeline input.
 
    .EXAMPLE
        Get-AdoTeam | Where-Object {
            'team-1' -in $_.name -or
            'team-2' -in $_.name
        }
 
        Retrieves multiple teams by their names.
 
    .EXAMPLE
        $params = @{
            CollectionUri = 'https://dev.azure.com/my-org'
            ProjectName = 'my-project-1'
        }
        Get-AdoTeam @params -Top 5
 
        Retrieves the first 5 teams from the specified project.
    #>

    [CmdletBinding(DefaultParameterSetName = 'ListTeams', SupportsShouldProcess)]
    param (
        [Parameter(ValueFromPipelineByPropertyName)]
        [ValidateScript({ Confirm-CollectionUri -Uri $_ })]
        [string]$CollectionUri = $env:DefaultAdoCollectionUri,

        [Parameter(ValueFromPipelineByPropertyName)]
        [Alias('ProjectId')]
        [string]$ProjectName = $env:DefaultAdoProject,

        [Parameter(ValueFromPipelineByPropertyName, ValueFromPipeline, ParameterSetName = 'ByNameOrId')]
        [Alias('TeamName', 'Id', 'TeamId')]
        [string]$Name,

        [Parameter(ParameterSetName = 'ListTeams')]
        [int]$Skip,

        [Parameter(ParameterSetName = 'ListTeams')]
        [int]$Top,

        [Parameter()]
        [Alias('ApiVersion')]
        [ValidateSet('7.1', '7.2-preview.3')]
        [string]$Version = '7.1'
    )

    begin {
        Write-Verbose ("Command: $($MyInvocation.MyCommand.Name)")
        Write-Debug ("CollectionUri: $CollectionUri")
        Write-Debug ("ProjectName: $ProjectName")
        Write-Debug ("Name: $($Name -join ',')")
        Write-Debug ("Skip: $Skip")
        Write-Debug ("Top: $Top")
        Write-Debug ("Version: $Version")

        Confirm-Default -Defaults ([ordered]@{
                'CollectionUri' = $CollectionUri
                'ProjectName'   = $ProjectName
            })
    }

    process {
        try {

            $queryParameters = [System.Collections.Generic.List[string]]::new()

            if ($Name) {
                $uri = "$CollectionUri/_apis/projects/$ProjectName/teams/$Name"
            } else {
                $uri = "$CollectionUri/_apis/projects/$ProjectName/teams"

                # Build query parameters
                if ($Skip) {
                    $queryParameters.Add("`$skip=$Skip")
                }
                if ($Top) {
                    $queryParameters.Add("`$top=$Top")
                }
            }

            $params = @{
                Uri             = $uri
                Version         = $Version
                QueryParameters = if ($queryParameters.Count -gt 0) { $queryParameters -join '&' } else { $null }
                Method          = 'GET'
            }

            if ($PSCmdlet.ShouldProcess($CollectionUri, $Name ? "Get Team: $Name in Project: $ProjectName" : "Get Teams for Project: $ProjectName")) {
                try {
                    $results = Invoke-AdoRestMethod @params
                    $teams = if ($Name) { @($results) } else { $results.value }
                    foreach ($t_ in $teams) {
                        [PSCustomObject]@{
                            id            = $t_.id
                            name          = $t_.name
                            description   = $t_.description
                            url           = $t_.url
                            identityUrl   = $t_.identityUrl
                            projectId     = $t_.projectId
                            projectName   = $t_.projectName
                            collectionUri = $CollectionUri
                        }
                    }
                } catch {
                    if ($_.ErrorDetails.Message -match 'NotFoundException') {
                        Write-Warning "Team with ID $Name does not exist, skipping."
                    } else {
                        throw $_
                    }
                }
            } else {
                Write-Verbose "Calling Invoke-AdoRestMethod with $($params | ConvertTo-Json -Depth 10)"
            }
        } catch {
            throw $_
        }
    }

    end {
        Write-Verbose ("Exit: $($MyInvocation.MyCommand.Name)")
    }
}