Articles

SAPIEN Technologies (Deutsch)

Nach vielen Jahren des Schreibens von Skripten für die Windows PowerShell — Konsole lerne ich jetzt die nächste Automatisierungsstufe-das Schreiben von GUI-Anwendungen, die Windows PowerShell-Befehle ausführen. PowerShell Studio Forms bieten eine sanfte und gut geführte Einführung in GUI-Anwendungen, aber ich habe immer noch einige Zeit gebraucht, um alte Gewohnheiten zu brechen.

Ich muss mich ständig daran erinnern, dass Dinge, die in der Konsole“ nur funktionieren“, in einer GUI keinen Sinn ergeben. Ausgabe schreiben ist einer von ihnen.,

Ausgabe in die Konsole schreiben

Wenn Sie eine Ausgabe in der Windows PowerShell-Konsole generieren, wird die Ausgabe als Textzeichenfolgen im Konsolenfenster angezeigt.

PS C:> Get-DateWednesday, December 3, 2014 7:16:38 AM

Hinter den Kulissen hängt Windows PowerShell stillschweigend einen Out-String-Befehl an die Pipeline an und sendet die Ergebnisse an“ Standardausgabe „(„stdout“). Der Prozess, der Windows PowerShell hostet, verarbeitet die Standardausgabe fast immer, indem er die Ausgabe in die Konsole schreibt (das Hostverhalten kann variieren).,

Wenn Sie also ein Cmdlet ausführen, das Objekte zurückgibt, z. B. das Get-Process-Cmdlet (Zeichenfolgendarstellungen von), werden die Objekte in der Konsole angezeigt.

Wenn Sie Objekte formatieren, z. B. mithilfe von Format-List oder Format-Table (Zeichenfolgendarstellungen von), werden die formatierten Objekte in der Konsole angezeigt.

Wenn Sie Write-Host oder Write-Output, Out-Host oder Out-String ausführen, werden die Ausgabezeichenfolgen in der Konsole angezeigt.

Und selbst wenn Sie die Ausgabe mithilfe von Write-Warning, Write-Verbose oder Write-Error an einen alternativen Ausgabestream senden, wird die Ausgabe standardmäßig in der Konsole angezeigt.,

Aber die GUI-Anwendung hat keine Konsole. Was passiert mit der Ausgabe, die sonst an die Konsole gehen würde, wenn es keine Konsole gibt? Und was noch wichtiger ist: Wie kann ich die Ausgabe ohne Konsole verwalten?

Wo ist meine Ausgabe?

GUI-Anwendungen, wie die coolen, die Sie in PowerShell Studio schreiben, haben keine Konsole. Es gibt keine Standardausgabe. Es gibt keine automatisch angehängte Out-Zeichenfolge.

Wenn Sie also eine Ausgabe generieren und nicht in einer Datei oder Variablen speichern, geht die Ausgabe einfach verloren.,

Get-Process | ... <Nowhere> ...

Es ist wie ein Pitcher, der einen Baseball wirft, wenn kein Fänger auf dem Feld ist. Der Ball fällt einfach zu Boden und rollt zum Stillstand .. ignorieren.

In einer GUI-Anwendung können Sie also nicht nur Ausgabe schreiben und auf das Beste hoffen. Wenn Sie die Cmdlet-Ausgabe anzeigen oder speichern möchten, müssen Sie dies explizit tun.

Ausgabe in einem Textfeld anzeigen

Eine GUI-Anwendung ist eine Sammlung von Steuerelementen. Um die Ausgabe anzuzeigen, müssen Sie die Ausgabe einem Steuerelement zuweisen, z. B. einem Textfeld, einem Rich-Text-Feld oder einem Datenraster.,

Um beispielsweise den Namen des lokalen Computers in der Konsole anzuzeigen, führen Sie den Befehl $env:ComputerName aus.

PS C:> $env:ComputerNameJUNEB-TESTBOX

Wenn ich dasselbe in einer GUI-Anwendung versuche, in der es keine Konsole gibt, sehe ich überhaupt kein Ergebnis. In diesem Beispiel habe ich ein Formular mit einer Schaltfläche erstellt, die beim Klicken den Ausdruck $env:ComputerName ausführt.,

$buttonComputerName_Click = { <b>$env:ComputerName</b>}

Aber, wenn ich auf die Schaltfläche klicke, passiert nichts, auch wenn ich ein console-Fenster zu öffnen.

Um den Computernamen in einer GUI-Anwendung anzuzeigen, füge ich meinem Formular ein Anzeigesteuerelement hinzu und ordne die Ausgabe des Befehls einer Methode des Anzeigesteuerelements zu.,

Zum Beispiel kann ich dem Formular ein Textfeldsteuerelement hinzufügen und den Zuweisungsoperator (=) verwenden, um das Ergebnis des Ausdrucks der Texteigenschaft des Textfelds zuzuweisen. Wenn Sie nun auf die Schaltfläche klicken, wird die Ausgabe im Textfeld angezeigt.

$buttonComputerName_Click = { $textboxResults.Text = $env: ComputerName}

Hier ist das Ergebnis:

Ausgabe in einem anderen Programm anzeigen

Sie können auch die Ausgabe von Befehlen in Objekten anzeigen, die nicht Teil Ihres Programms sind., GUI-Profis denken, dass dieser Ansatz schlampig ist und keine bewährte Methode, aber Sie könnten es nützlich für das Testen oder Debuggen finden.

Sie können die Ausgabe beispielsweise an das Cmdlet Out-GridView weiterleiten.

$buttonComputerName_Click = { $env:ComputerName | Out-GridView}

Hier ist das Ergebnis:

Sie können auch in eine Datei schreiben und die Datei öffnen. Diese Beispielbefehle erstellen eine temporäre Datei, schreiben in die Datei und verwenden dann Notepad, um die Datei anzuzeigen., Auch dies lässt echte Programmierer erschaudern, aber es funktioniert zumindest zum Testen.

Hier ist das Ergebnis:

In Zeichenfolgen konvertieren

Eine weitere Aufgabe, die Sie in einer GUI-Anwendung verwalten müssen, ist das Konvertieren von Objekten in Textzeichenfolgen. Normalerweise bedeutet dies nur, dass Sie Ihre Ausgabe an ein Out-Cmdlet wie Out-String. Out Cmdlets, einschließlich Out-GridView, konvertieren Objekte in String-Daten.

Wenn Sie die Ausgabe in die Konsole schreiben, hängt Windows PowerShell automatisch einen Out-String-Befehl an die Pipeline an., Es gibt jedoch keine Konsole und keinen automatischen Out-String in einer GUI-Anwendung.

Wenn Sie einem String-Objekt oder einem Steuerelement, das String-Objekte wie ein Textfeld verwendet, Nicht-String-Objekte zuweisen, ruft Windows PowerShell die Methode toString() des Objekts auf. (In anderen Sprachen würde die Zuweisung einfach fehlschlagen, aber sie versucht zu helfen.) Mit einigen Objekten, wie DateTime und ErrorRecord Objekte, toString() funktioniert gut, aber in vielen Fällen produziert es seltsam-aussehende Ergebnisse.

Dieser Befehl weist beispielsweise die Ergebnisse eines Get-Process-Befehls einem Textfeld zu., Windows PowerShell erkennt, dass Sie Text benötigen, und ruft die Methode toString() von Prozessobjekten auf, aber das Ergebnis ist nicht nützlich.

$buttonGetProcess_Click = { $textboxResults.Text = Get-Process}

Um eine String-Darstellung der Standardprozesstabelle zu erhalten, leiten Sie die Ausgabe an das Out-String-Cmdlet weiter und weisen Sie sie dann dem Textfeld zu.

$buttonGetProcess_Click = { $textboxResults.,Text = Get-Process | Out-String}

TIPP: Um die Ausgabe leicht zu Lesen, legen Sie das Textfeld (oder rich-text-Feld) zu verwenden, monospace-schriftart. Klicken Sie in PowerShell Studio mit der rechten Maustaste auf das Textfeld, klicken Sie auf Eigenschaftssatz anwenden und dann auf Konsolenschriftart anwenden.

Vermeiden Sie toString () nicht vollständig. Es gibt einige Objekte, bei denen die Methode toString() ein nützliches Ergebnis liefert. DateTime-Objekte sind das klassische Beispiel. Die toString ()-Methode eines DateTime-Objekts gibt eine Zeichenfolge im Format „short-date/long-time“ zurück. Out-String gibt ein „long-date/long-time“ Format zurück.,

#Verwendet toString()$buttonGetDate_Click = { $textboxDate.Text = Get-Date}

#Verwendet toString()$buttonGetDate_Click = { $textboxDate.Text = Get-Date / Out-String}

Sie können auch die Format-und UFormat-Parameter des Get-Date-Cmdlets verwenden, um eine formatierte Datumszeichenfolge in fast jeder Konfiguration abzurufen., Um beispielsweise ein Datum im RFC1123-Format abzurufen, verwenden Sie-Format R (oder „r“). Wenn Sie Format oder UFormat verwenden, müssen Sie keine Pipe an Out-String senden, da diese Parameter das Cmdlet zwingen, eine Zeichenfolge zurückzugeben.

PS C:> Get-Date -Format RTue, 09 Dec 2014 10:46:41 GMT

Konvertieren formatierter Objekte

In der Konsole sind Format-Cmdlets wie Format-Table normalerweise das letzte Element in einer Pipeline. Die Ausgabe sieht in der Konsole gut aus, da Windows PowerShell einen Out-String-Befehl an die Pipeline anfügt, bevor er an die Konsole gesendet wird.,

In einer GUI-Anwendung erhalten Sie jedoch standardmäßig das Ergebnis des Aufrufs der Methode toString() der Formatobjekte, die die Format-Cmdlets zurückgeben.

$buttonGetHotfix_Click = { $textboxHotFix.Text = Get-HotFix / Format-Table-Property HotFixID, InstalledOn-AutoSize}

Um eine benutzerfreundlichere Anzeige in Ihrer GUI-Anwendung zu erhalten, leiten Sie die Formatobjekte an das Out-String-Cmdlet weiter, bevor Sie sie der Texteigenschaft des Textfelds zuweisen.,

Das ist besser!

Nach einer Weile wird die Aufgabe, die Ausgabeanzeige in Ihren GUI-Anwendungen zu verwalten, so natürlich wie die Eingabe eines Cmdlet-Namens, aber während Sie lernen, sollten Sie testen und sicherstellen, dass alle Ihre Ausgabe erfasst und in einem verwendbaren Format angezeigt wird.

June Blender ist Technology Evangelist bei SAPIEN Technologies, Inc. Sie können sie erreichen unter [email protected] oder folgen Sie ihr auf Twitter unter @juneb_get_help.