Articles

SAPIEN Technologies

na vele jaren van het schrijven van scripts voor de Windows PowerShell — console, leer ik nu het volgende niveau van automatisering-schrijven GUI-toepassingen die Windows PowerShell-opdrachten uitvoeren. PowerShell Studio vormen bieden een zachte en goed geleide introductie tot GUI-toepassingen, maar het heeft me nog steeds wat tijd gekost om oude gewoonten te doorbreken.

Ik moet mezelf er voortdurend aan herinneren dat dingen die “gewoon werken” in de console geen enkele zin hebben in een GUI. Het schrijven van output is een van hen.,

uitvoer naar de Console schrijven

wanneer u uitvoer genereert in de Windows PowerShell-console, wordt de uitvoer weergegeven als tekstreeksen in het consolevenster.

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

achter de schermen voegt Windows PowerShell stilletjes een Out-String commando toe aan de pijplijn en stuurt de resultaten naar” standard output “(“stdout”). Het proces dat host Windows PowerShell behandelt de standaard uitvoer, bijna altijd door het schrijven van de uitvoer naar de console (host gedrag kan variëren).,

dus, als u een cmdlet uitvoert die objecten retourneert, zoals de Get-Process cmdlet, (tekenreeksen van) de objecten verschijnen in de console.

Als u objecten formatteert, zoals door gebruik te maken van Format-List of Format-Table, verschijnen (tekenreeksen van) de opgemaakte objecten in de console.

Als u Write-Host of Write-Output, Out-Host of Out-String uitvoert, verschijnen de uitvoerreeksen in de console.

en zelfs als u de uitvoer naar een alternatieve uitvoerstroom verzendt met Write-Warning, Write-Verbose of Write-Error, verschijnt de uitvoer standaard in de console.,

maar de GUI-toepassing heeft geen console. Wat gebeurt er met de uitvoer die anders naar de console zou gaan als er geen console is? En, nog belangrijker, hoe kan ik de uitvoer beheren zonder een console?

Waar is mijn uitvoer?

GUI-toepassingen, zoals de coole die je schrijft in PowerShell Studio, hebben geen console. Er is geen standaard uitvoer. Er is geen automatisch toegevoegde Out-String.

dus, wanneer u output genereert en deze niet opslaat in een bestand of een variabele, is de output gewoon verloren.,

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

Het is als een werper die een honkbal gooit als er geen catcher op het veld is. De bal valt gewoon op de grond en rolt tot stilstand .. negeren.

in een GUI-toepassing kun je dus niet alleen uitvoer schrijven en het beste hopen. Als u cmdlet-uitvoer wilt weergeven of opslaan, moet u dit expliciet doen.

weergave-uitvoer in een tekstvak

een GUI-toepassing is een verzameling besturingselementen. Als u de uitvoer wilt weergeven, moet u de uitvoer toewijzen aan een besturingselement, zoals tekstkader, rich-tekstkader of een gegevensraster.,

om bijvoorbeeld de naam van de lokale computer in de console weer te geven, voert u een opdracht $Env:ComputerName uit.

PS C:> $env:ComputerNameJUNEB-TESTBOX

wanneer ik hetzelfde probeer in een GUI-toepassing waar geen console is, zie ik helemaal geen resultaat. In dit voorbeeld heb ik een formulier gemaakt met een knop die, wanneer erop geklikt wordt, de $env:ComputerName expressie uitvoert.,

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

Maar, als ik op de knop klikt, gebeurt er niets, zelfs als ik een console venster te openen.

om de computernaam in een GUI-toepassing weer te geven, voeg ik een display control toe aan mijn formulier en wijs de uitvoer van het commando toe aan een methode van de display control.,

bijvoorbeeld, Ik kan een tekstvak controle toevoegen aan het formulier en gebruik de toewijzing operator (=) om het resultaat van de expressie toe te wijzen aan de eigenschap tekst van het tekstvak. Wanneer u nu op de knop klikt, ziet u de uitvoer in het tekstvak.

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

Dit is het resultaat:

uitvoer weergeven in een ander programma

U kunt ook de uitvoer weergeven van opdrachten in objecten die geen deel uitmaken van uw programma., GUI professionals denken dat deze aanpak is slordig en niet een best practice, maar je zou kunnen vinden het nuttig voor het testen of debuggen.

bijvoorbeeld, u kunt de uitvoer doorsluizen naar de cmdlet Out-GridView.

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

Dit is het resultaat:

u kan ook naar een bestand schrijven en het bestand openen. Deze voorbeeldcommando ‘ s maken een tijdelijk bestand, schrijven naar het bestand en gebruiken vervolgens Kladblok om het bestand weer te geven., Nogmaals, dit maakt echte programmeurs ineenkrimpen, maar het werkt, in ieder geval voor het testen.

Dit is het resultaat:

converteren naar tekenreeksen

een andere taak die u moet beheren in een GUI-toepassing is het converteren van objecten naar tekstreeksen. Meestal betekent dit gewoon dat je uitvoer wordt doorgesluisd naar een Out cmdlet, zoals Out-String. Out cmdlets, inclusief Out-GridView, converteren objecten naar string data.

wanneer u uitvoer naar de console schrijft, voegt Windows PowerShell automatisch een Out-String commando toe aan de pijplijn., Maar er is geen console en geen automatische Out-String in een GUI-toepassing.

wanneer u niet-tekenreeksobjecten toewijst aan een tekenreeksobject of aan een besturingselement dat tekenreeksobjecten neemt, zoals een tekstvak, roept Windows PowerShell de ToString () – methode van het object aan. (In andere talen zou de opdracht gewoon mislukken, maar het probeert te helpen.) Bij sommige objecten, zoals DateTime en errorrecord objecten, werkt toString () prima, maar in veel gevallen levert het vreemd uitziende resultaten op.

bijvoorbeeld, dit commando wijst de resultaten van een Get-Process commando toe aan een tekstvak., Windows PowerShell herkent dat je tekst nodig hebt en roept de ToString() methode van Procesobjecten aan, maar het resultaat is niet nuttig.

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

om een string representatie van de standaard procestabel te krijgen, pipe de uitvoer naar de Out-String cmdlet en wijs het dan toe aan het tekstvak.

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

TIP: om de uitvoer gemakkelijk te lezen, stelt u het tekstkader (of rich text box) in op een monospace-lettertype. Klik in PowerShell Studio met de rechtermuisknop op het tekstvak, klik op eigenschappenset Toepassen en klik vervolgens op Consolelettertype toepassen.

vermijd toString () niet volledig. Er zijn een paar objecten waar de ToString () methode een nuttig resultaat oplevert. DateTime objecten zijn het klassieke voorbeeld. De ToString () methode van een DateTime object geeft een” short-date/long-time ” format string terug. Out-String geeft een” long-date/long-time ” formaat terug.,

PS C:> (Get-Date).ToString()12/6/2014 10:42:24 AMPS C:> Get-Date | Out-StringSaturday, December 6, 2014 10:42:37 AM

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

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

u kunt ook de opmaak-en Uformatparameters van de Get-Date cmdlet gebruiken om een opgemaakte datumstring in bijna elke configuratie te krijgen., Bijvoorbeeld, om een datum in RFC1123 formaat te krijgen, Gebruik-Formaat R (of “r”). U hoeft geen pipe naar Out-String te maken als u Format of UFormat gebruikt, omdat deze parameters de cmdlet dwingen een string terug te geven.

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

converteren van opgemaakte objecten

in de console zijn cmdlets, zoals Format-Table, meestal het laatste element in een pijplijn. De uitvoer ziet er geweldig uit in de console, omdat Windows PowerShell een Out-String Commando toevoegt aan de pijplijn voordat het naar de console wordt verzonden.,

maar in een GUI applicatie, standaard, krijg je het resultaat van het aanroepen van de ToString () methode van de opmaak objecten die de opmaak cmdlets retourneren.

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

om een meer bruikbare weergave in uw GUI-toepassing te krijgen, pipe de opmaakobjecten naar de Out-String cmdlet voordat u ze toewijst aan de Text-eigenschap van het tekstvak.,

dat is beter!

na een tijdje wordt de taak van het beheren van de uitvoerweergave in uw GUI-toepassingen net zo natuurlijk als het typen van een cmdlet-naam, maar terwijl u aan het leren bent, moet u testen en ervoor zorgen dat al uw uitvoer wordt vastgelegd en weergegeven in een bruikbaar formaat.June Blender is een evangelist bij SAPIEN Technologies, Inc. U kunt haar bereiken op [email protected] of volg haar op Twitter op @juneb_get_help.