Execution
5.7.0
Common execution helpers, self-elevation and stub-script wrapper for PowerShell.
Minimum PowerShell version
5.1
Installation Options
Owners
Copyright
(c) 2026 mtb.me. All rights reserved.
Package Details
Author(s)
- Manuel
Tags
Execution Self-Elevation Stub PowerShell Windows Environment EnvVar PATH PSModulePath
Functions
Add-ToMultiValueEnvVar Clear-TempDirectories ConvertTo-SplatHashtable Exit-AndWaitOnUI Format-SplatHashtable Get-QuotedPath Invoke-NativeCommand Invoke-StubScript Invoke-WhenFileChanged Invoke-WithProgressBoard Invoke-WithSpinner New-ProgressBoard Remove-EnvVar Remove-FromMultiValueEnvVar Remove-ItemSafe Remove-NativeProgressNoise Restart-SelfElevated Set-EnvVar Set-PSScriptID Show-Countdown Write-Change Write-Dim Write-Fail Write-Header Write-Item Write-Ok
PSEditions
Dependencies
This module has no dependencies.
Release Notes
Execution v5.7.0+sha.39a33b1
## [v5.7.0] - 2026-08-18
### Added
- `Invoke-WithProgressBoard` und `New-ProgressBoard`: ein Progress-Board fuer n
parallel laufende, benannte Zeilen -- `Invoke-WithSpinner` ist der Fall n=1.
`Invoke-WithProgressBoard` spannt das Board fuer die Dauer eines
ScriptBlocks auf, uebergibt es als ersten Parameter, raeumt im `finally`
auf und reicht die Ausgabe des ScriptBlocks unveraendert durch. Es startet
selbst keine Worker -- die Nebenlaeufigkeit bleibt beim Aufrufer
(`ForEach-Object -Parallel`, `Start-ThreadJob`, ein Runspace-Pool oder gar
keine). Meldungen aus fremden Runspaces laufen ueber eine schlichte
Hashtable auf einer `ConcurrentQueue`
(`$board.Queue.Enqueue(@{ Name = ...; State = ...; Detail = ... })`), ohne
dass der Worker dieses Modul oder einen seiner Typen kennen muss.
`New-ProgressBoard` erzeugt das Board separat, wenn man nach dem Lauf noch
an die Zustaende oder die Historie will (Wiederaufsatz ueber `-History`).
- Sieben Zustaende je Zeile: `Waiting`, `Running`, `Succeeded`, `Failed`,
`Skipped`, `Warned`, `Cancelled`. Erlaubter Pfad ist `Waiting -> Running ->`
ein Endzustand, ein Endzustand ist endgueltig; jeder andere Uebergang und
jeder Zustand ausserhalb der sieben ist ein terminierender Fehler statt
eines still ignorierten Ergebnisses.
- Fuenf Maler, einmal beim Start gewaehlt und danach nicht mehr getestet:
`Table` (animierte Tabelle, automatische Wahl auf einer faehigen Konsole),
`Stream` (nur laufende Zeilen im Block, fertige Zeilen scrollen hoch -- nie
automatisch gewaehlt), `CI` (GitHub-Actions-Log-Gruppen statt Animation,
automatisch bei gesetztem `GITHUB_ACTIONS`), `Log` (eine schlichte Zeile je
fertiger Zeile, angehaengt sobald sie fertig ist -- ohne Escape-Sequenz und
ohne Cursor, also in Datei und Pipe unveraendert lesbar; die automatische
Wahl ueberall dort, wo Animation unmoeglich ist und `Start-ThreadJob`
existiert) und `Plain` (kein Terminal, keine Escape-Sequenzen, kein Thread
-- alle Zeilen erst am Ende; der Fallback ohne `Start-ThreadJob`, der immer
geht). Ein ausdruecklich angeforderter Maler, den die Konsole nicht traegt,
degradiert auf `Log`, solange `Start-ThreadJob` da ist, sonst auf `Plain`.
- Die bleibende Zeile traegt den sechsspaltigen Zustands-Tag (`[ ok ]`,
`[fail]`, `[skip]`, `[warn]`, `[stop]`, ...). Der Glyph des Writers allein
trennt die sieben Zustaende nicht -- `Warned` teilt sich `Write-Item` mit
`Running`, `Cancelled` teilt sich `Write-Fail` mit `Failed` --, und bei
`Table`, `Plain` und dem CI-Rest ist diese Zeile alles, was am Ende stehen
bleibt. Betrifft auch die Ergebnis-Zeile von `Invoke-WithSpinner`: sie liest
dieselbe Quelle.
- Die Zustands-Tags sind Woerter statt Glyphen. `Succeeded` und `Failed`
trugen den Haken bzw. das Kreuz aus `New-GlyphTable`; auf der bleibenden
Zeile steht der Glyph des Writers ohnehin schon davor, also sagte eine
fertige Zeile dasselbe zweimal. Damit haengt kein Tag mehr am Glyph-Satz:
ein gerenderter Rahmen ist unabhaengig davon, was die Konsole zeichnen kann,
und `Get-ProgressStateTable` nimmt folgerichtig keine Faehigkeit mehr
entgegen.
- Die Zeilenbreite wird in Anzeigespalten gemessen statt in UTF-16-Einheiten.
Ein doppelt breites Zeichen (CJK, die meisten Emoji) belegt eine Einheit und
zwei Spalten; eine Zeile voll davon kam so durch die Deckelung, lief dann
ueber, brach um und verschob die Cursor-Arithmetik des Blocks. Gemessen wird
ueber `StringInfo`-Textelemente plus East-Asian-Width, geschnitten wird
elementweise.
- Die Tag-Spalte der bleibenden Zeile steht bei allen sieben Zustaenden an
derselben Stelle. `Write-Dim` ist der einzige der vier Board-Writer ohne
Glyph, also begannen `Waiting` und `Skipped` zwei Spalten weiter links als
die uebrigen fuenf -- unter `Table`, wo jede Zeile unter der naechsten steht,
musste der Tag damit gesucht statt gelesen werden. Der Ausgleich sitzt an der
einen Stelle, die den fehlenden Glyph ohnehin schon feststellt, also erben
ihn beide bleibenden Pfade.
- Die Abschlusszeile unterscheidet drei Faelle statt zwei. Sie meldete Erfolg,
sobald nichts fehlgeschlagen war -- auch fuer ein Board, dessen Zeilen nie
gelaufen waren, und auch fuer einen Lauf, der nur gewarnt hatte. Jetzt:
Fehlschlag bei `Failed` oder `Cancelled`, weder-noch bei einer Zeile ohne
Endzustand oder einem `Warned`, Erfolg sonst. `Skipped` bleibt Erfolg --
uebersprungen ist kein Mangel und der Normalfall jedes Wiederaufsatzes.
- `Get-ConsoleCapability`: viertes, unabhaengiges Flag `Ansi` -- ob die
Konsole eine Escape-Sequenz ausfuehrt statt sie als Text auszugeben. Treibt
die Maler-Wahl von `Invoke-WithProgressBoard` (zusammen mit `Animation` und
`Start-ThreadJob` noetig fuer die animierten Maler), nicht die sechs
Anzeige-Writer aus v5.6.0.
### Fixed
- `Invoke-WithProgressBoard`: Der Abschluss im `finally` hielt einen Maler, dessen
Thread nie einen Slot bekommen hat, faelschlich fuer gestoppt. Der Zustandstest
lautete `-ne 'Running'`, und `NotStarted` ist ungleich `Running` -- der Kanal
wurde also ein zweites Mal geleert, waehrend der Maler jederzeit anlaufen und
dasselbe tun konnte. Genau das Rennen, gegen das der uebersprungene Schluss-Drain
und die Warnung ueberhaupt existieren. Getestet wird jetzt auf die drei
Endzustaende `Completed`, `Failed`, `Stopped`; jeder andere Zustand zaehlt als
"laeuft noch".
FileList
- Execution.nuspec
- Execution.psd1
- Execution.psm1
- Templates\README.md
- Templates\_add-this-dir-to-VARNAME-envvar.cmd.template
- Templates\_add-this-dir-to-VARNAME-envvar.machine.cmd.template
- Templates\_add-this-dir-to-VARNAME-envvar.machine.ps1.template
- Templates\_add-this-dir-to-VARNAME-envvar.ps1.template
- Templates\_remove-this-dir-from-VARNAME-envvar.cmd.template
- Templates\_remove-this-dir-from-VARNAME-envvar.machine.cmd.template
- Templates\_remove-this-dir-from-VARNAME-envvar.machine.ps1.template
- Templates\_remove-this-dir-from-VARNAME-envvar.ps1.template
- Templates\add-envvar.cmd.template
- Templates\add-envvar.interactive.cmd.template
- Templates\add-envvar.interactive.machine.cmd.template
- Templates\add-envvar.interactive.machine.ps1.template
- Templates\add-envvar.interactive.ps1.template
- Templates\add-envvar.machine.cmd.template
- Templates\add-envvar.machine.ps1.template
- Templates\add-envvar.ps1.template
- Templates\remove-envvar.cmd.template
- Templates\remove-envvar.machine.cmd.template
- Templates\remove-envvar.machine.ps1.template
- Templates\remove-envvar.ps1.template
Version History
| Version | Downloads | Last updated |
|---|---|---|
| 5.7.0 (current version) | 26 | 8/19/2026 |
| 5.6.0 | 808 | 7/29/2026 |
| 5.5.0 | 1,276 | 6/12/2026 |
| 5.4.1 | 92 | 6/11/2026 |
| 5.4.0 | 727 | 5/18/2026 |
| 5.3.4 | 124 | 5/15/2026 |
| 5.3.3 | 23 | 5/15/2026 |
| 5.3.2 | 186 | 5/11/2026 |
| 5.3.1 | 137 | 5/8/2026 |
| 5.3.0 | 109 | 5/7/2026 |
| 5.2.1 | 50 | 5/6/2026 |
| 5.2.0 | 87 | 5/6/2026 |
| 5.1.0 | 221 | 5/5/2026 |
| 5.0.0 | 10 | 5/5/2026 |
| 4.0.0 | 72 | 5/4/2026 |
| 3.0.1 | 498 | 4/16/2026 |
| 3.0.0 | 7 | 4/16/2026 |
| 2.1.1 | 1,666 | 12/29/2025 |
| 2.1.0 | 8 | 12/29/2025 |
| 2.0.2 | 75,834 | 4/28/2024 |
| 2.0.1 | 328 | 4/27/2024 |
| 2.0.0 | 11 | 4/26/2024 |
| 1.7.0 | 23,958 | 3/9/2020 |
| 1.6.2 | 447 | 2/5/2020 |
| 1.6.1 | 88 | 2/3/2020 |
| 1.6.0 | 42 | 2/3/2020 |
| 1.5.1 | 2,281 | 4/24/2019 |
| 1.5.0 | 202 | 4/1/2019 |
| 1.4.4 | 51 | 3/31/2019 |
| 1.4.3 | 43 | 3/31/2019 |
| 1.4.2 | 47 | 3/31/2019 |
| 1.4.1 | 44 | 3/30/2019 |
| 1.4.0 | 44 | 3/30/2019 |
| 1.3.0 | 44 | 3/30/2019 |
| 1.2.2 | 43 | 3/29/2019 |
| 1.2.1 | 42 | 3/29/2019 |
| 1.2.0 | 70 | 3/28/2019 |
| 1.1.0 | 50 | 3/27/2019 |
| 1.0.2 | 48 | 3/26/2019 |
| 1.0.1 | 106 | 3/17/2019 |
| 1.0.0 | 68 | 3/17/2019 |