Execution

5.7.0

Common execution helpers, self-elevation and stub-script wrapper for PowerShell.

Minimum PowerShell version

5.1

Installation Options

Copy and Paste the following command to install this package using PowerShellGet More Info

Install-Module -Name Execution

Copy and Paste the following command to install this package using Microsoft.PowerShell.PSResourceGet More Info

Install-PSResource -Name Execution

You can deploy this package directly to Azure Automation. Note that deploying packages with dependencies will deploy all the dependencies to Azure Automation. Learn More

Manually download the .nupkg file to your system's default download location. Note that the file won't be unpacked, and won't include any dependencies. Learn More

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

Desktop Core

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
Show more