SAPIENS Teknologier
Efter mange år med at skrive manuskripter til Windows PowerShell console, jeg er ved at lære det næste niveau af automatisering — skriver GUI-programmer, der kører Windows PowerShell-kommandoer. Po .ershell Studio formularer giver en blid og godt guidet introduktion til GUI applikationer, men det har stadig taget mig lidt tid at bryde gamle vaner.
Jeg er konstant nødt til at minde mig selv om, at ting, der “bare fungerer” i konsollen, ikke giver nogen mening i en GUI. Skrivning output er en af dem.,
skrivning af Output til konsollen
Når du genererer output i Powerindo .s Po .ershell-konsollen, vises output som tekststrenge i konsolvinduet.
PS C:> Get-DateWednesday, December 3, 2014 7:16:38 AM
Bag kulisserne, Windows PowerShell lydløst føjer en Ud-String-kommando til rørledningen og sender resultaterne til “standard output” (“stdout”). Den proces, der er vært for Windows PowerShell håndtag standard output, næsten altid ved at skrive outputtet til konsollen (host adfærd kan variere).,
så hvis du kører en cmdlet, der returnerer objekter, såsom Get-Process cmdlet, (strengrepræsentationer af), vises objekterne i konsollen.
Hvis du formaterer objekter, f.eks. ved at bruge Format-List eller Format-Table, (string repræsentationer af) vises de formaterede objekter i konsollen.
Hvis du kører Writerite-Host eller Writerite-Output, Out-Host eller Out-String, vises outputstrengene i konsollen.
og selvom du sender output til en alternativ outputstrøm ved at bruge skrive-advarsel, skrive-Verbose eller skrive-fejl, vises output som standard i konsollen.,
men GUI-applikationen har ikke en konsol. Hvad sker der med output, der ellers ville gå til konsollen, når der ikke er nogen konsol? Og endnu vigtigere, hvordan administrerer jeg output uden en konsol?
hvor er min output?
GUI-applikationer, som de seje, du skriver i Po .ershell Studio, har ikke en konsol. Der er ingen standard output. Der er ingen automatisk tilføjet out-String.
så når du genererer output og ikke gemmer det i en fil eller en variabel, er output bare tabt.,
Get-Process | ... <Nowhere> ...
det er som en kande, der kaster en baseball, når der ikke er nogen catcher på banen. Bolden falder bare til jorden og ruller til et stop .. ignoreret.
så i en GUI-applikation kan du ikke bare skrive output og håbe på det bedste. Hvis du vil vise cmdlet output eller gemme det, skal du gøre det eksplicit.
Vis output i en tekstboks
en GUI-applikation er en samling af kontroller. For at vise output skal du tildele output til en kontrol, f.eks.,for eksempel at vise navnet på den lokale computer i konsollen, kører du en $env:ComputerName-kommando.
PS C:> $env:ComputerNameJUNEB-TESTBOX
Når jeg prøver det samme i en GUI-applikation, hvor der ikke er nogen konsol, ser jeg slet ikke noget resultat. I dette eksempel oprettede jeg en formular med en knap, der, når den klikkes, kører $env:ComputerName-udtrykket.,
$buttonComputerName_Click = { <b>$env:Computernavn</b>}
Men når jeg klikker på knappen, sker der ingenting, selv om jeg har en konsol vinduet åbent.
for at vise computernavnet i en GUI-applikation tilføjer jeg en skærmkontrol til min form og tildeler output fra kommandoen til en metode til skærmkontrollen.,
for eksempel kan jeg tilføje en Tekstbokskontrol til formularen og bruge tildelingsoperatøren (=) til at tildele resultatet af udtrykket til Tekstegenskaben i tekstboksen. Nu, når du klikker på knappen, ser du output i tekstboksen.
$buttonComputerName_Click = { $textboxResults.Tekst = $env:Computernavn}
Her er resultatet:
vis Output i et Andet Program
Du kan også vise uddata fra kommandoer i objekter, der ikke er en del af dit program., GUI fagfolk mener, at denne tilgang er sjusket og ikke en bedste praksis, men du kan finde det nyttigt for test eller debugging.
for eksempel kan du rør udgangen til out-Gridvie.cmdlet.
$buttonComputerName_Click = { $env:Computernavn | Out-GridView}
Her er resultatet:
Du kan også skrive til en fil, og åbne den fil. Disse prøvekommandoer opretter en midlertidig fil, skriver til filen og bruger derefter notesblok til at vise filen., Igen får dette rigtige programmører til at krybe, men det fungerer, i det mindste til test.
Her er resultatet:
Konverter til strenge
en anden opgave, du har brug for at administrere i en GUI-applikation, er at konvertere objekter til tekststrenge. Normalt betyder det bare rør din output til en ud cmdlet, såsom Out-String. Out cmdlets, herunder Out-Gridvie., konvertere objekter til streng data.
Når du skriver output til konsollen, tilføjer Powerindo .s Po .ershell automatisk en Out-String-kommando til rørledningen., Men der er ingen konsol og ingen automatisk Out-String i en GUI-applikation.
Når du tildeler ikke-strengobjekter til et strengobjekt eller til en kontrol, der tager strengobjekter, såsom en tekstboks, kalder methodindo .s Po .ershell toString () – metoden for objektet. (På andre sprog ville opgaven bare mislykkes, men det forsøger at hjælpe.) Med nogle objekter, såsom DateTime og ErrorRecord-objekter, fungerer toString () fint, men i mange tilfælde producerer det underlige resultater.
for eksempel tildeler denne kommando resultaterne af en Get-Process-kommando til en tekstboks., Windows PowerShell anerkender, at du har brug for tekst, og kalder toString () – metode til at Behandle objekterne, men resultatet er ikke nyttigt.
$buttonGetProcess_Click = { $textboxResults.Tekst = Get-Processen}
for At få en string repræsentation af det standard proces bordet, pipe output til Ud-String cmdlet og derefter tildele det til tekstfeltet.
$buttonGetProcess_Click = { $textboxResults.,Tekst = Get-Processen | Ud-String}
TIP: for At gøre output let at læse, der tekstfeltet (eller rich text box) til at bruge en monospace font. I Po .ershell Studio skal du højreklikke på tekstfeltet, klikke på Anvend ejendomssæt og derefter klikke på Anvend konsol skrifttype.
undgå ikke toString() helt. Der er et par objekter, hvor toString () – metoden giver et nyttigt resultat. DateTime objekter er det klassiske eksempel. ToString () – metoden for et DateTime-objekt returnerer en” short-date/long-time ” – formatstreng. Out-String returnerer en” lang Dato/lang tid ” format.,
PS C:> (Get-Date).ToString()12/6/2014 10:42:24 AMPS C:> Get-Date | Out-StringSaturday, December 6, 2014 10:42:37 AM
#Bruger toString()$buttonGetDate_Click = { $textboxDate.Tekst = Get-Dato}
#Bruger toString()$buttonGetDate_Click = { $textboxDate.Tekst = Get-Dato | Ud-String}
Du kan også bruge det Format og UFormat parametre for de Få-Dato cmdlet at få en formateret streng i næsten enhver konfiguration., For eksempel, for at få en dato i rfc1123 format, brug-Format R (eller”r”). Ingen grund til at rør til Out-streng, når du bruger Format eller UFormat, fordi disse parametre tvinge cmdlet til at returnere en streng.
PS C:> Get-Date -Format RTue, 09 Dec 2014 10:46:41 GMT
Konvertering Formatted Objects
I konsollen, Format-cmdlet-kommandoer, såsom Format-Bord, er som regel det sidste element i en rørledning. Udgangen ser godt ud i konsollen, fordi Powerindo .s Po .ershell tilføjer en Out-String-kommando til rørledningen, før den sendes til konsollen.,
men i en GUI-applikation får du som standard resultatet af at kalde toString () – metoden for formatobjekter, som formatet cmdlets vender tilbage.
$buttonGetHotfix_Click = { $textboxHotFix.Tekst = Get-HotFix | Format-Tabel -Ejendom HotFixID, InstalledOn -AutoSize}
for At få en mere brugbar skærm i din GUI-program, rør format objekter til Ud-String cmdlet inden tildele dem til egenskaben Tekst i Tekstfeltet.,
det er bedre!
efter et stykke tid bliver opgaven med at styre outputdisplayet i dine GUI-applikationer lige så naturlig som at skrive et cmdlet-navn, men mens du lærer, skal du sørge for at teste og sørge for, at al din output er fanget og vises i et brugbart format.juni Blender er en teknologi evangelist på SAPIEN Technologies, Inc. Du kan nå hende på [email protected] eller følg hende på Twitter på @juneb_get_help.