<# : @echo off rem mode con: cols=25 lines=5 title Keepawake powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "$content = [System.IO.File]::ReadAllText('%~f0'); Invoke-Expression $content" exit /b #> $keyInterval = 50 # SendKeys every n seconds #$frames = '|', '/', '-', '\' #$frameMs = 250 # New spinner frame every n ms <# Other spinner options if the file exists #> $spinnerName = "dots3" $spinFile = "spinners.json" # From https://raw.githubusercontent.com/sindresorhus/cli-spinners/refs/heads/main/spinners.json $wsh = New-Object -ComObject WScript.Shell $width = [Console]::WindowWidth function center([string]$text) { $pad = [math]::Max(0, [math]::Floor(($width - $text.Length) / 2)) # Pad to width-1 to ensure text never wraps (' ' * $pad + $text).PadRight($width -1) } function Draw([int]$row, [string]$text, [string]$color) { [Console]::SetCursorPosition(0, $row) Write-Host (Center $text) -NoNewline -ForegroundColor $color } function FindSpinners([string]$fname) { $allSpinners = Get-content $fname | convertfrom-json # -encoding utf8 return $allSpinners | foreach-object {$_.PSObject.Properties} | where-object { $_.name -like 'b*'} } function minFrameTime([string]$allSpinners) { $minFrameTime = 100 foreach ($item in $spinners) { if ($item.Value.interval -lt $minFrameTime) { $minFrameTime = $item.Value.interval } } return $minFrameTime } # # Actual loop # try { [Console]::CursorVisible = $false Clear-Host $spinners = FindSpinners $spinFile $minFrameTime = minFrameTime $spinners # $minFrameTime = 20 # fucking 17ms? $sc = $spinners.Count Draw 1 "Let's go! (${sc} - $minFrameTime)" Green $gfi = 0 # Global frame index while (1) { $si = 2 foreach ($item in $spinners) { $name = $item.Name $frameMs = $item.Value.interval $frames = $item.Value.frames $lf_mult = $frameMs / $minFrameTime #local frame time porportional to global $lfi = $gfi / $lf_mult # local frame index $curFrame = $frames[$lfi % $frames.Count] Draw $si "${name}: $curFrame" Cyan $si++ } $gfi++ Start-Sleep -Milliseconds $minFrameTime } } finally { [Console]::CursorVisible = $true }