Public/Get-SummitSchedule.ps1
|
function Get-SummitSchedule { <# .SYNOPSIS Gets the PowerShell + DevOps Global Summit schedule. .DESCRIPTION Returns sessions from the bundled schedule data. No network calls required. Supports filtering by day, speaker, category, or title search. .PARAMETER Year The summit year to query. Defaults to the current year. .PARAMETER Day Filter sessions by day of the week. .PARAMETER Speaker Filter sessions by speaker name (wildcard match). .PARAMETER Category Filter sessions by category/track. .PARAMETER Search Search session titles (wildcard match). .PARAMETER Detail Return all properties for each session (description, tags, speaker company, etc.) instead of the default summary view. .EXAMPLE Get-SummitSchedule .EXAMPLE Get-SummitSchedule -Day Monday .EXAMPLE Get-SummitSchedule -Category Keynote .EXAMPLE Get-SummitSchedule -Speaker "Justin" -Day Tuesday .EXAMPLE Get-SummitSchedule -Search "PowerShell" | Get-SummitSession .EXAMPLE Get-SummitSchedule -Day Monday -Detail #> [CmdletBinding()] [OutputType('SummitSchedule.Session')] param( [int]$Year = (Get-Date).Year, [ValidateSet('Monday', 'Tuesday', 'Wednesday', 'Thursday')] [string[]]$Day, [string]$Speaker, [ValidateSet( 'Artificial Intelligence', 'Automation', 'Cloud', 'DevOps', 'Focus Group', 'Food', 'General', 'Keynote', 'PowerShell', 'Quality of Life', 'Real-World Solutions', 'Security', 'Soft Skills & Career Growth', 'Summit' )] [string[]]$Category, [string]$Search, [switch]$Detail ) $dataFile = Join-Path $script:DataPath "$Year.json" if (-not (Test-Path $dataFile)) { Write-Error "No schedule data found for $Year. Available years: $($script:AvailableYears -join ', ')" return } if (-not $script:Cache.ContainsKey($Year)) { $raw = Get-Content -Path $dataFile -Raw | ConvertFrom-Json $sessions = [System.Collections.Generic.List[PSCustomObject]]::new() foreach ($r in $raw) { $sessions.Add([PSCustomObject]@{ PSTypeName = 'SummitSchedule.Session' Day = $r.Day Date = $r.Date Time = $r.Time Title = $r.Title Room = $r.Room Speaker = $r.Speaker Category = $r.Category EventId = $r.EventId Url = $r.Url Year = [int]$r.Year }) } $script:Cache[$Year] = $sessions } $results = $script:Cache[$Year] if ($Day) { $results = @($results | Where-Object { $_.Day -in $Day }) } if ($PSBoundParameters.ContainsKey('Speaker') -and $Speaker) { $results = @($results | Where-Object { $_.Speaker -like "*$Speaker*" }) } if ($Category) { $results = @($results | Where-Object { $_.Category -in $Category }) } if ($Search) { $results = @($results | Where-Object { $_.Title -like "*$Search*" }) } if ($Detail) { if ($results.Count -eq 0) { return } $raw = Get-Content -Path $dataFile -Raw | ConvertFrom-Json $eventIds = $results | ForEach-Object { $_.EventId } foreach ($r in $raw) { if ($r.EventId -in $eventIds) { [PSCustomObject]@{ PSTypeName = 'SummitSchedule.SessionDetail' Title = $r.Title Day = $r.Day Date = $r.Date Time = $r.Time Speaker = $r.Speaker SpeakerCompany = $r.SpeakerCompany Room = $r.Room Category = $r.Category Tags = $r.Tags Description = $r.Description EventId = $r.EventId Url = $r.Url Year = [int]$r.Year } } } return } $results } |