3 Minuten Lesezeit (562 Worte)

Kurz und gut – Episode #22 Wo stehen wir? Fortschrittsanzeige in PowerShell

Läuft ein Skript länger als eine Minute, werde ich immer etwas nervös. Läuft es noch? Was macht es gerade? Wie lange dauert es noch? 

Immer gut: Logging

Ein gutes Skript schreibt ein Protokoll, im besten Fall mit einem Logging-Framework wie beispielsweise PSFramework von Friedrich Weinmann. Hier habe ich die Möglichkeit, Meldungen für später zu speichern oder aber direkt auf dem Bildschirm anzuzeigen.

Wenn mein Skript aber auch sein Ergebnis auf dem Bildschirm ausgibt oder es viele Schritte sind, dann wird die Ausgabe auf dem Bildschirm schnell unübersichtlich.

Noch besser: Fortschrittsanzeige

Daher ist eine zusätzliche Ausgabe des aktuellen Zustands an immer der gleichen Stelle auf dem Bildschirm sinnvoll. Nach Abschluss der Verarbeitung wird diese nicht mehr benötigt und verschwindet einfach.

PowerShell bietet hierfür die Funktion Write-Progress. Diese Funktion kann nicht nur den aktuellen Zustand über die drei Parameter Activity, Status und CurrentOperation darstellen, sondern zusätzlich auch einen über den Parameter PercentComplete visualisierten Fortschrittsbalken. Die Antwort auf die klassische Frage „Wie lange dauert es denn noch?“ kann mithilfe des Parameters SecondsRemaining auf dem Bildschirm dargestellt werden.

Vorher: Ein Beispielskript

Das folgende Beispiel hat keinen wirklichen Nutzen, ist aber schön klein und läuft auf jeder Windowsumgebung. Es durchläuft die Dateien eines Verzeichnisses und wartet jeweils ein paar Sekunden: 

$files = Get-ChildItem -Path C:\Windows -File
Write-Host "Verarbeite gleich $($files.Count) Dateien"
foreach ($file in $files) {
    Write-Host "Arbeite gerade an Datei $($file.Name)"
    Start-Sleep -Seconds 2
} 

Nachher: Den Zustand immer im Blick

Das Skript wird jetzt um die für die Fortschrittsanzeige benötigten Zeilen ergänzt und dafür auf die Ausgaben mit Write-Host verzichtet:

$files = Get-ChildItem -Path C:\Windows -File
$progressParameter = @{ Activity = 'Verarbeite Dateien' }
$progressTotal = $files.Count
$progressCompleted = 0 
$progressStart = Get-Date
foreach ($file in $files) {
    $progressParameter.Status = "$progressCompleted von $progressTotal Dateien verarbeitet"
    $progressParameter.CurrentOperation = "verarbeite aktuell $($file.Name)"
    $progressParameter.PercentComplete = $progressCompleted * 100 / $progressTotal
    if ($progressParameter.PercentComplete -gt 0) {
        $progressParameter.SecondsRemaining = ((Get-Date) - $progressStart).TotalSeconds / $progressParameter.PercentComplete * (100 - $progressParameter.PercentComplete)
    }
    Write-Progress @progressParameter
    Start-Sleep -Seconds 2
    $progressCompleted++
}
Write-Progress @progressParameter -Completed 

Ja, das sind schon einige Zeilen Code, die hier hinzukommen. Aber speichern Sie sich doch den Link zu diesem Artikel, und Sie haben die Zeilen immer griffbereit. Die notwendigen Anpassungen an die aktuelle Aufgabe des Skriptes sind dann schnell gemacht. 

Und so sieht es aus

Die Darstellung unterscheidet sich je nach PowerShell-Version und verwendetem Programm.

Ich nutze häufig die PowerShell ISE, die kleine Entwicklungsumgebung der PowerShell 5.1. Dort sieht es so aus:

In der klassischen powershell.exe der Version 5.1 sieht es so aus: 

Bei der pwsh.exe, also der aktuellen PowerShell in der Version 7.4, kann die Darstellung über die Variable $PSStyle.Progress.View angepasst werden. Der Wert ist nach Start auf „Minimal“ gesetzt, die Ausgabe sieht dann so aus: 

Mit dem Befehl $PSStyle.Progress.View = 'Classic' kann die Ausgabe so verändert werden, dass sie wie bei der Version 5.1 wieder alle Informationen enthält: 

Fazit

Hat man die notwendigen Zeilen griffbereit, ist eine Fortschrittsanzeige sehr schnell in ein PowerShell-Skript eingebaut. Damit können Fragen wie Was macht das Skript gerade?oder Wie lange dauert es noch?jederzeit beantwortet werden.

Haben Sie spezielle Anforderungen? Sprechen Sie uns gerne an.

Seminarempfehlung

Principal Consultant bei ORDIX

 

Kommentare

Derzeit gibt es keine Kommentare. Schreibe den ersten Kommentar!
Montag, 16. September 2024

Sicherheitscode (Captcha)

×
Informiert bleiben!

Bei Updates im Blog, informieren wir per E-Mail.