Private/Show-ProjectSelection.ps1

function Show-ProjectSelection {
    [CmdletBinding()]
    param([array]$Projects)

    Write-Host "`n========================================" -ForegroundColor Cyan
    Write-Host 'PSADT Project Selection'                   -ForegroundColor Cyan
    Write-Host "========================================`n" -ForegroundColor Cyan
    Write-Host (" {0,-4} {1,-22} {2}" -f '#', 'Template', 'Application') -ForegroundColor Gray
    Write-Host (" " + ('-' * 60)) -ForegroundColor DarkGray

    for ($i = 0; $i -lt $Projects.Count; $i++) {
        $tpl   = if ($Projects[$i].PSObject.Properties.Name -contains 'Template') { $Projects[$i].Template } else { '' }
        $color = if ($i % 2 -eq 0) { 'Cyan' } else { 'White' }
        Write-Host (" {0,-4} {1,-22} {2}" -f ($i + 1), $tpl, $Projects[$i].Name) -ForegroundColor $color
    }

    Write-Host ''
    do {
        $rawInput = Read-Host "Select project (1-$($Projects.Count))"
        $parsed   = 0
        $valid    = [int]::TryParse($rawInput.Trim(), [ref]$parsed) -and $parsed -ge 1 -and $parsed -le $Projects.Count
        if (-not $valid) { Write-Host "Please enter a number between 1 and $($Projects.Count)." -ForegroundColor Red }
    } while (-not $valid)

    return $Projects[$parsed - 1]
}