public/progress/Invoke-SpectreCommandWithProgress.ps1
function Invoke-SpectreCommandWithProgress { <# .SYNOPSIS Invokes a Spectre command with a progress bar. .DESCRIPTION This function takes a script block as a parameter and executes it while displaying a progress bar. The context and task objects are defined at [https://spectreconsole.net/api/spectre.console/progresscontext/](https://spectreconsole.net/api/spectre.console/progresscontext/). The context requires at least one task to be added for progress to be displayed. The task object is used to update the progress bar by calling the `Increment()` method or other methods defined in Spectre console [https://spectreconsole.net/api/spectre.console/progresstask/](https://spectreconsole.net/api/spectre.console/progresstask/). See https://spectreconsole.net/live/progress for more information. .PARAMETER ScriptBlock The script block to execute. .EXAMPLE # **Example 1** # This example demonstrates a 4-stage process with one loading bar that loads in four chunks. Invoke-SpectreCommandWithProgress -ScriptBlock { param ( [Spectre.Console.ProgressContext] $Context ) # AddTask() returns a https://spectreconsole.net/api/spectre.console/progresstask/ object $task1 = $Context.AddTask("A 4-stage process") Start-Sleep -Seconds 1 $task1.Increment(25) Start-Sleep -Seconds 1 $task1.Increment(25) Start-Sleep -Seconds 1 $task1.Increment(25) Start-Sleep -Seconds 1 $task1.Increment(25) Start-Sleep -Seconds 1 } .EXAMPLE # **Example 2** # This example demonstrates a 2-stage process with two loading bars running in parallel. Invoke-SpectreCommandWithProgress -ScriptBlock { param ( [Spectre.Console.ProgressContext] $Context ) $jobs = @() $jobs += Add-SpectreJob -Context $Context -JobName "Drawing a picture" -Job ( Start-Job { $progress = 0 while($progress -lt 100) { $progress += 1.5 Write-Progress -Activity "Processing" -PercentComplete $progress Start-Sleep -Milliseconds 50 } } ) $jobs += Add-SpectreJob -Context $Context -JobName "Driving a car" -Job ( Start-Job { $progress = 0 while($progress -lt 100) { $progress += 0.9 Write-Progress -Activity "Processing" -PercentComplete $progress Start-Sleep -Milliseconds 50 } } ) Wait-SpectreJobs -Context $Context -Jobs $jobs } .EXAMPLE # **Example 3** # This example demonstrates a task with an unknown (indeterminate) duration. $result = Invoke-SpectreCommandWithProgress -ScriptBlock { param ( [Spectre.Console.ProgressContext] $Context ) $task1 = $Context.AddTask("Task with unknown duration") $task1.IsIndeterminate = $true Start-Sleep -Seconds 5 $task1.Value = 100 return "Some result" } Write-SpectreHost "Result: $result" .EXAMPLE # **Example 4** # This example demonstrates a job with an estimated duration, after the estimated duration has passed the job will switch to an indeterminate state. $result = Invoke-SpectreCommandWithProgress -ScriptBlock { param ( [Spectre.Console.ProgressContext] $Context ) $job = Add-SpectreJob -Context $Context -JobName "Doing some work" -Job ( Start-Job { Start-Sleep -Seconds 10 return 1234 } ) Wait-SpectreJobs -Context $Context -Jobs $job -EstimatedDurationSeconds 5 $result = Receive-Job -Job $job.Job return $result } Write-SpectreHost "Result: $result" #> [Reflection.AssemblyMetadata("title", "Invoke-SpectreCommandWithProgress")] param ( [Parameter(Mandatory)] [scriptblock] $ScriptBlock ) Start-AnsiConsoleProgress $ScriptBlock } |