Last active
June 8, 2025 17:57
-
-
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/
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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