Skip to content

Instantly share code, notes, and snippets.

@dancing-groot
Last active June 8, 2025 17:57
Show Gist options
  • Save dancing-groot/b6b381c48e98409b70cb84c810893b2e to your computer and use it in GitHub Desktop.
Save dancing-groot/b6b381c48e98409b70cb84c810893b2e to your computer and use it in GitHub Desktop.
Generic function for using progress bars - based on https://adamtheautomator.com/write-progress/
#region FUNCTIONS
function Write-ProgressHelper
{
<#
.SYNOPSIS
Generic function for using progress bars
.LINK
https://gist.github.com/dancing-groot/b6b381c48e98409b70cb84c810893b2e
.NOTES
Version: 2025.06.08
Author: @dancing-groot
#>
[CmdletBinding(DefaultParameterSetName = 'Running')]
param (
[int]$Id = 0,
[Parameter(Mandatory, ParameterSetName = 'Running')][Parameter(ParameterSetName = 'Finished')][string]$Activity,
[Parameter(Mandatory, ParameterSetName = 'Running')][string]$Message,
[Parameter(Mandatory, ParameterSetName = 'Running')][int]$StepNumber,
[Parameter(Mandatory, ParameterSetName = 'Running')][Parameter(ParameterSetName = 'Finished')][int]$TotalSteps,
[Parameter(Mandatory, ParameterSetName = 'Finished')][switch]$Completed
)
switch ($PSCmdlet.ParameterSetName)
{
'Running' { Write-Progress -Id $Id -Activity $Activity -Status $Message -PercentComplete (($StepNumber / $TotalSteps) * 100); break }
'Finished' { Write-Progress -Id $Id -Completed; break }
}
} # Write-ProgressHelper
#endregion FUNCTIONS
#region MAIN
#region EXAMPLE1
Write-Host "EXAMPLE 1 - If you only need one progress bar in your script" -ForegroundColor Green
# Declare variables for example 1 progress bar
$Folder = "C:\Program Files\Common Files"
$Foo = Get-ChildItem -Path $Folder -Directory
$ProgressHelperFolder = @{
Activity = "List Folders in '$Folder'"
TotalSteps = $Foo.Count
}
$StepFolderCount = 1
# Run example 1
Write-ProgressHelper @ProgressHelperFolder -Message "Starting..." -StepNumber $StepFolderCount
foreach ($Bar in $Foo)
{
Write-Host $Bar.Name
Write-ProgressHelper @ProgressHelperFolder -Message $Bar.Name -StepNumber ($StepFolderCount++)
Start-Sleep -Seconds 1
}
Write-ProgressHelper @ProgressHelperFolder -Completed
Write-Host "EXAMPLE 1 COMPLETED."
Start-Sleep 3
#endregion EXAMPLE1
#region EXAMPLE2
Write-Host "EXAMPLE 2 - If you need to run a progress bar using a different iteration" -ForegroundColor Green
# Declare variables for example 2 progress bar
$CustomProgressTotalSteps = 10
$ProgressHelperCustom = @{
Activity = "Counting from 1 to $CustomProgressTotalSteps"
TotalSteps = $CustomProgressTotalSteps
}
# Run example 2
for ($i = 1; $i -le $CustomProgressTotalSteps; $i++)
{
Write-Host $i
Write-ProgressHelper @ProgressHelperCustom -Message "$i/$CustomProgressTotalSteps" -StepNumber $i
Start-Sleep 1
}
Write-ProgressHelper @ProgressHelperCustom -Completed
Write-Host "EXAMPLE 2 COMPLETED."
Start-Sleep 3
#endregion EXAMPLE2
#region EXAMPLE3
Write-Host "EXAMPLE 3 - If you need to run nested progress bars" -ForegroundColor Green
# Declare variables for example 1 progress bar
$ParentFolder = "C:\Program Files\Common Files"
$Parent = Get-ChildItem -Path $ParentFolder -Directory
$ProgressHelperParentFolder = @{
Id = 0
Activity = "List Folders in '$ParentFolder'"
TotalSteps = $Parent.Count
}
$StepParentCount = 1
# Run example 3
if ($Parent.Count -eq 0)
{
Write-Host "No folders found in '$ParentFolder'." -ForegroundColor Yellow
return
}
Write-ProgressHelper @ProgressHelperParentFolder -Message "Starting..." -StepNumber $StepParentCount
foreach ($ChildOfParent in $Parent)
{
Write-Host $ChildOfParent.Name
Write-ProgressHelper @ProgressHelperParentFolder -Message $ChildOfParent.Name -StepNumber ($StepParentCount++)
# Process child folder
$ChildFolder = "C:\Program Files\Common Files\$($ChildOfParent.Name)"
$Child = Get-ChildItem -Path $ChildFolder -Directory
$ProgressHelperChildFolder = @{
Id = 1
Activity = "-> List Folders in '$ChildFolder'"
TotalSteps = $Child.Count
}
$StepChildCount = 1
if ($Child.Count -eq 0)
{
Write-Host "No folders found in '$ChildFolder'." -ForegroundColor Yellow
}
else
{
Write-ProgressHelper @ProgressHelperChildFolder -Message "Starting..." -StepNumber $StepChildCount
foreach ($ChildOfChild in $Child)
{
Write-Host "`t\$($ChildOfChild.Name)"
Write-ProgressHelper @ProgressHelperChildFolder -Message $ChildOfChild.Name -StepNumber ($StepChildCount++)
Start-Sleep -Seconds 1
}
Start-Sleep -Seconds 1
Write-ProgressHelper @ProgressHelperChildFolder -Completed
}
}
Write-ProgressHelper @ProgressHelperParentFolder -Completed
Write-Host "EXAMPLE 3 COMPLETED."
#endregion EXAMPLE3
#endregion MAIN
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment