Archiv für den Monat: November 2015

Reaktionsfreudige WPF-Dialogfelder mit „DoEvents“

Wer sein PowerShell-Skript mit einer Fensteroberfläche ausstatten möchte, verwendet dafür WinForms oder WPF. Beide Techniken sind fester Bestandteil der .NET-Laufzeit und damit der PowerShell ab Version 2.0 und beide besitzen ihre kleineren Vor- und Nachteile. Mir gefällt WPF etwas besser, da ich das XAML, mit dem ein Fenster mit seinen Bedienelementen definiert wird, „runterschreiben“ kann ohne dabei viel überlegen zu müssen (ein Ergebnis jahrerlanger Übung). Ein Nachteil ist, genau wie bei WinForms, das ein Fenster immer dann „einfriert“, wenn eine etwas länger andauernde Operation durchgeführt wird, die den Hauptthread blockiert. Es gibt im Web zahlreiche Lösungsvorschläge, die für alle eines gemeinsam haben: Sie sind zu kompliziert, da der Autor einen allgemeinen Ansatz vorstellt, mit dem sich generell beliebige Befehle auf einem weiteren Thread ausführen lassen. Soll lediglich ein Fenster etwas reaktionsfreudiger werden, geht es sehr viel einfacher mit Hilfe des Dispatcher-Objekts, das jedes WPF-Element zur Verfügung stellt:

$ListBox ist ein Beispiel für ein beliebiges WPF-Control, [Action] macht aus einem leeren Scriptblock einen Action-Delegaten und „Background“ ist die Abkürzung für die Enumerationskonstante System.Windows.Threading.DispatcherPriority.Background.

Das folgende Beispiel ist etwas umfangreicher, aber einfach. Es zeigt ein WPF-Fenster mit einer ListBox an, die mit den Zahlen von 1 bis 100 gefüllt wird. Ein Start-Sleep simuliert eine länger dauernde Operation. Dank dem Dispatcher-Aufruf friert weder das Fenster ein, noch ist der zweite Button blockiert, mit dem die ListBox geleer wird.

Eine WPF-ListBox, die Dank Dispatcher-Aufruf etwas reaktionsfreudiger ist

Eine WPF-ListBox, die Dank Dispatcher-Aufruf etwas reaktionsfreudiger ist (aus einem Mpeg4-Video nach Gif konvertiert unter http://ezgif.com)

Stunde der Wahrheit oder Wahrheitstabellen per PowerShell ausgeben

Die folgende Function wird vermutlich niemand jemals wirklich brauchen, ich finde sie trotzdem ganz nett, zumal sie ein weiteres Beispiel für „Power-Scripting“ mit der PowerShell ist. Ich stelle im Folgenden eine Function vor, die sog. Wahrheitstabellen ausgibt. In einer solchen Tabelle werden auf der Grundlage der elementaren Regeln der Aussagenlogik (in meiner Fuction gibt es nur UND, ODER, EQV und IMP) logische $True/$False-Werte zu einem Ergebniswert verknüpft. Nett ist an meiner Function, dass die Anzahl der Aussagenvariablen beliebig ist, es funktioniert mit A und B genau wie mit A, B, C, D und E usw.

Hier einfaches Beispiel für einen UND-Junktor:

A B R
0 0 0
0 1 0
1 0 0
1 1 1

Das Ergebnis ist nur dann 1, wenn alle verknüpften Variablen den Wert 1 besitzen. Hier ist die Function:

Aufgerufen wird die Function wie folgt:

Nett wäre es natürlich, wenn man gleich eine „logische Formel“ wie -A ^ B v C übergeben könnte. Interessant war bei der Umsetzung, dass es gar nicht so einfach ist per PowerShell eine „richtige“ logische Verknüpfung durchzuführen, wenn die Operanden als String oder Char vorliegen. Um z. B. zu erreichen, dass ein 1 -OR 0 eine 1 und kein $true liefert, ist eine Typenkonvertierung erforderlich:

Ich glaube, ich hatte bereits erwähnt, dass das vermutlich niemals jemand benötigen wird, eine nette Übung war die Umsetzung trotzdem.

PowerShell Usergroup Süddeutschland – (über-) nächstes Treffen am 3.12.2015 in Ulm (bzw. um Ulm herum)

Das inzwischen vierte Treffen der PowerShell User Group Süddeutschland findet am 3.12.2015 wieder in den Räumen der Firma Horaios in Ulm statt. Weitere Infos gibt es hier:

http://powershell-ug.com/?lang=de_DE

Ich war bei zwei Treffen inzwischen dabei und kann nur feststellen, dass sich ein Besuch lohnt. Die User Group ist, wie sollte es anders sein, offen für alle, die sich für die PowerShell interessieren. Vorkenntnisse spielen keine Rolle. Laut Themenplan wird beim nächsten Mal der Autor des wirklich genialen „Reportingtools“ PScribo sein Tool per Skype vorstellen.

Passend zur Jahreszeit gibt es bestimmt Lebkuchenherzen;)