PowerShell – 09 – Processbar (Ladebalken) verwenden

Save page

Bei einigen Abfragen dauert es manchmal etwas länger. Da wäre es doch hilfreich zu wissen wie weit man im Prozess vorangeschritten ist. Genau für solche Fälle gibt es in PowerShell die Funktion Write-Progress. Mit dieser lässt sich anzeigen an welcher Stelle das Script momentan ist, bzw. die Schleife die durchlaufen wird. Die Ausgabe der Information erfolgt  schriftlich und/oder mittels eines Ladebalken (Processbar). Wer die Cmdlets von Quest bereits nutzt, wird bei einigen Abfragen wie beispielsweise Get-QADUser den Processbar bereits kennen.

Das einfachste Beispiel um ein Processbar zu nutzen ist eine For-Schleife. In dem folgendem Code-Beispiel wird lediglich bis 100 hochgezählt. Da der Vorgang keinerlei größerer Rechenleitung bedarf, geht es ziemlich flott. Doch damit man überhaupt etwas von dem Prozess mitbekommt, habe ich die Funktion Sleep verwendet.

Sleep

Mit der Funktion Sleep lässt sich ein Script für eine bestimmte Zeitspanne anhalten. Dies kann beispielsweise bei der Verarbeitung  von Daten am Active Directory nützlich sein. Hier können unter Umständen bei einigen Aktionen über das Script mehr, bzw. schneller Daten geschrieben werden, als der Server der Datenbank verarbeiten kann. Sleep hat zwei wichtige Parameter, das wäre einmal -Seconds und zum anderen -Milliseconds. Im folgendem Script wird das Script bei jedem Schritt jeweils um 100 ms angehalten.

Man sieht beim Ausführen eine leichte Verzögerung. Wem das nicht reicht, setzt einfach den Wert des Parameters -Milliseconds auf 1000 oder man änder den Paramter zu – Seconds 1. Dann wartet das Script jeweils 1 Sekunde zwischen den Schritten. Nun das Ganze mit einem Processbar.

Write-Progress

Mit der Funktion Write-Progress wird ein Processbar erzeugt. Mit dem Parameter -Activity wird das oberer Textlabel befüllt. Der Parameter -PercentComplete dient zur Darstellung des Processbar und ist optional. Wird dieser Parameter weggelassen, erscheint dennoch ein Processbar, mit dem allerdings nichts geschieht. Wie gibt man den Takt für den Processbar korrekt an? Dazu muss der Prozentanteil exakt ermittelt werden, hierbei kommt die allseits bekannte Prozentrechnung ins Spiel.
\frac{i}*100{Gesamtsumme}
Sind in einem Array beispielsweise mehre Daten wie Usernamen hinterlegt, so kann man die Anzahl der User mittels $Array.Count ermitteln. Das ist die Gesamtsumme. Wichtig wird diese Formel bei allen Schleifentypen außer For. Weiter unten im Text werde ich noch ein Beispiel mit der Foreach-Schleife erläutern. Zu guter Letzt gibt es noch den Parameter -Status. Hier kann der aktuell zu bearbeitende Wert ausgeben werden. Hier nun das simple Beispiel, ohne rechenaufwand.

Wer ebenso wie ich die PowerShell ISE nutzt, dem wird dies dann wie folgt in einer Grafik angezeigt. Der Zähler ist bei $i=17. So lassen sich über den Parameter das aktuell bearbeitete Objekt anzeigen.

ProgressBar in der ISE

Für alle die das Script in der Console ausführen, sieht das Ganze dann so aus.

ProgressBar in der Console

Jetzt möchte ich noch ein paar Beispiele mit For-Schleifen und auch mit den bereits angekündigten Foreach-Schleifen aufzeigen. Im folgendem Script lasse ich einfach alle Files des Windows-Ordners aufzählen.

Get-ChildItem

Zunächst werden alle Elemente in die Variable $files mit Hilfe der Funktion Get-ChildItem und mit dem zugehörigen Parameter -Path geladen. -Path gibt den Pfad des Ordners an.  Für den Parameter -PercentComplete darf der maximal Wert nicht höher als 100 sein. Also muss der Wert der Files, hier z.B. 121, als 100 angenommen werden. Wir rechnen hier ($i * 100 )/121 um den prozentualen Wert der Variable $i zu ermitteln. Aber nun von der grauen Theorie in die bunte Praxis.Exciting

$files | Select name listet lediglich nach dem Ausführen der For-Schleife alle Werte des Array $files auf. Wieder habe ich die Sleep Funktion benutzt, da dieser Job einfach zu schnell für unsere Testzwecke laufen würde.

ProgressBar ermittelte Daten

In einigen meiner Scripte nutze ich den Parameter -PercentComplete nicht. Dennoch werde ich hier nun die versprochenen Foreach-Scripte zeigen und näher bringen. Hier muss man sich ein paar nur Gedanken zur Variable $i machen, ansonsten läuft der Vorgang analog zur For-Scheife. Die Variable $i wird für die Angabe des Parameters PercentComplete gebraucht und wird in der Foreach-Schleife hoch gezählt. Um eventuelle Fehler zu vermeiden wird $i vor und nach der Schleife Null gesetzt.

Die Angabe der zu durchsuchenden OU kann in kanonischer Form, sprich Stefan.Rehwald/Arbeitbereich/Test/TEST-Gruppe oder als DN (distinguished name), also OU=TEST-Gruppe,OU=TEST,OU=Arbeitsbereich,DC=Stefan,DC=Rehwald angegeben werden.

ProgressBar ermittelte User

Auch hier habe ich wieder Sleep verwenden, da dieser Vorgang bei den wenigen User-Objekten rasch durchgeführt ist. Meist nutze ich die Prozentanzeige nicht, sattdessen nehme ich den Counter der zu bearbeitenden Daten und lasse die Variable $i wie im ersten Foreach-Script hochzählen. Das Ganze lasse ich mir dann über Parameter -Status ausgeben.

 Im zweiten Script habe diesmal den DN ansatt des kanonischen Wertes angeben. Wie man auf der nachfolgenden Grafik sehen kann, wird der Ladebalken, auch wenn er nicht genutzt wird, angezeigt. Es lassen sich natürlich auch beide Scriptvarianten kombinieren.

ProgressBar ermittelte User II

 So weit zum Thema Processbar, Ladebalken.

rewe

Kommentar verfassen