Articles

SAPIEN Teknologier

Etter mange år på å skrive manus for Windows PowerShell-konsollen, jeg nå å lære av de neste grad av automatisering — skriving av GUI-applikasjoner som kjører Windows PowerShell-kommandoer. PowerShell Studio former gir et mildt og godt guidet introduksjon til GRAFISKE programmer, men det er likevel tatt meg litt tid å bryte gamle vaner.

jeg stadig må minne meg selv på at ting som «bare fungerer» i konsollen ikke gir noen mening i en GUI. Skriftlig utdata er en av dem.,

Skriver Utdata til Konsoll

Når du generere utdata i Windows PowerShell-konsollen, vises utdataene som tekststrenger i konsoll vinduet.

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

Bak kulissene, Windows PowerShell stille og legger en Ut-Streng kommando til rørledningen og sender resultatet til standard utdata» («stdout»). Den prosessen som er vert for Windows PowerShell håndterer standard output, nesten alltid ved skriftlig utdata til konsoll (vert atferd kan variere).,

Så, hvis du kjører en cmdlet som returnerer objekter, for eksempel Get-Process-cmdlet-en, (string representasjoner av) gjenstander vises på konsollen.

Hvis du formaterer objekter, for eksempel ved hjelp av Format-Listen, eller Format-Table, (string representasjoner av) formatert gjenstander vises på konsollen.

Hvis du kjører Write-Host eller Skrive-Utgang, Ut-Vert eller Ut-Strengen, utgang strenger vises i konsollen.

selv om du vil sende utdata til en alternativ utgang strøm ved hjelp av Skrive-Advarsel, Skrive-Verbose, eller Skrive-Feil, som standard, vises utdataene i konsollen.,

Men GUI-program har ikke en konsoll. Hva skjer med utgang som ellers ville gå til konsollen når det er ingen konsollen? Og, enda viktigere, hvordan kan jeg administrere utgang uten en konsoll?

Hvor er min utgang?

GUI-applikasjoner, som de kule de som du skriver i PowerShell Studio, har ikke en konsoll. Det er ingen standard output. Det er ingen automatisk lagt Ut-Streng.

Så, når du genererer output og ikke lagre til fil eller en variabel, utgang er bare tapt.,

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

Det er som en mugge å kaste en baseball når det er ingen catcher på feltet. Ballen bare faller til bakken og ruller til en stopp .. overse.

Så, i en GUI-program, kan du ikke bare skrive utgang og håpe på det beste. Hvis du ønsker å vise cmdlet utgang eller lagre det, og du trenger å gjøre det eksplisitt.

Vise utdata i en tekstboks

EN GUI-program er en samling av kontroller. For å vise utdata, må du tilordne den utgang til en kontroll, for eksempel tekst-boksen, rik tekst-boks, eller en data grid.,

For eksempel, for å vise navnet på den lokale datamaskinen i konsollen, kan du kjøre en $env:Datamaskinnavn kommando.

PS C:> $env:ComputerNameJUNEB-TESTBOX

Når jeg prøver det samme i en GUI-program der det er ingen konsollen, kan jeg ikke se noe resultat i det hele tatt. I dette eksempelet har jeg laget et skjema med en knapp som, når den klikkes, kjører $env:Datamaskinnavn uttrykk.,

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

Men, når jeg klikker på knappen, skjer det ingenting, selv om jeg har en konsoll-vinduet er åpent.

for Å vise navnet på datamaskinen i en GUI-program, jeg vil legge til en vis kontroll til min form og tilordne resultatet av kommandoen til en metode i displayet kontroll.,

For eksempel, kan jeg legge til en Tekstboks kontroll til form og bruk tilordningsoperatoren (=) for å tilordne resultatet av uttrykket til Tekst holderen for Tekstboksen. Nå, når du klikker på knappen, får du se resultatet i Tekstboksen.

$buttonComputerName_Click = { $textboxResults.Tekst = $env:Datamaskinnavn}

Her er resultatet:

Vise Utdata i et Annet Program,

Du kan også vise utdata fra kommandoer i objekter som ikke er en del av programmet., GUI fagfolk tror at denne tilnærmingen er slurvete og ikke en beste praksis, men du kan finne det nyttig for testing eller feilsøking.

du kan For eksempel rør den ut til Ut-GridView cmdleten.

$buttonComputerName_Click = { $env:Datamaskinnavn | Ut-GridView}

Her er resultatet:

Du kan også skrive til en fil og åpne filen. Disse utvalget kommandoer opprette en midlertidig fil, skrive til filen, og deretter bruke Notepad for å vise filen., Igjen, dette gjør at real programmerere cringe, men det fungerer, i alle fall for testing.

Her er resultatet:

Konverter til Strenger

en Annen oppgave du trenger for å administrere i en GUI-program som konverterer objekter til tekst-strenger. Vanligvis, dette betyr bare piping din utgang til en cmdlet, for eksempel Ut-Streng. Ut cmdlets, blant annet Ut-GridView, konvertere objekter å string data.

Når du skriver utdata til konsoll, Windows PowerShell automatisk legger en Ut-Streng kommando til rørledningen., Men, det er ingen konsoll og ingen automatisk Ut-Streng i en GUI-program.

Når du tilordne ikke-string-objekter for et string-objekt eller en kontroll som tar string-objekter, for eksempel en Tekstboks, en Windows PowerShell kaller toString() metode for objektet. (I andre språk, oppdraget ville bare mislykkes, men det er å prøve å hjelpe.) Med noen gjenstander, som for eksempel DateTime og ErrorRecord objekter, toString() fungerer helt fint, men, i mange tilfeller, det produserer odd-ser resultater.

For eksempel vil denne kommandoen gir resultatene av en Prosess-kommandoen til en tekstboks., Windows PowerShell anerkjenner at du trenger tekst og kaller den toString() metode for å Behandle objekter, men resultatet er ikke nyttig.

$buttonGetProcess_Click = { $textboxResults.Tekst = Get-Prosessen}

for Å få en streng representasjon av standard prosess bordet, rør den ut til Ut-String-cmdlet-en og deretter tilordne den til tekstboksen.

$buttonGetProcess_Click = { $textboxResults.,Tekst = Get-Process | Ut-String}

TIPS: for Å gjøre produksjonen lett å lese, angi tekst-boksen (eller rik tekst-boks) til å bruke en monospace font. I PowerShell Studio, høyreklikk tekstboksen, klikker Gjelder Eiendom som er Satt, og deretter klikker du Bruk Konsollen Skrift.

ikke unngå toString() helt. Det er et par gjenstander hvor den toString() metoden gir et brukbart resultat. DateTime-objekter er det klassiske eksempel. Den toString() metode for en DateTime-objekt returnerer en «kort-dato/lang-tid» – format string. Ut-Strengen) 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

#Bruker toString()$buttonGetDate_Click = { $textboxDate.Tekst = Get-Date}

#Bruker toString()$buttonGetDate_Click = { $textboxDate.Tekst = Get-Dato | Ut-String}

Du kan også bruke Format og UFormat parametere av Get-Date cmdlet for å få en formatert dato streng i nesten alle konfigurasjon., For eksempel, for å få en dato i RFC1123 format, bruker -Format R (eller «r»). Du trenger ikke å pipe til Ut-Streng når du bruker Format eller UFormat, fordi disse parametrene kraft cmdleten for å returnere en string.

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

Konvertering Formatert Objekter

I konsollen, Format cmdlets, for eksempel Format-Table, er vanligvis det siste elementet i en rørledning. Output ser flott ut i konsollen, fordi Windows PowerShell legger en Ut-Streng kommando til rørledningen før du sender den til konsollen.,

Men, i en GUI-program, som standard, får du resultatet av kalle toString() metode for formatet objekter som Format-cmdlets tilbake.

$buttonGetHotfix_Click = { $textboxHotFix.Tekst = Get-Hurtigreparasjonen | Format-Table -Eiendom HotFixID, InstalledOn -AutoSize}

for Å få en mer brukbare vises i GUI-program, rør formatet objekter til Ut-String-cmdlet-en før du tilordner dem til Tekst holderen for Tekstboksen.,

Det er bedre!

Etter en stund, oppgaven med å administrere utgang vises i GUI-applikasjoner blitt like naturlig som å skrive en cmdlet navn, men mens du lærer, sørg for å teste og sørg for at alle dine utdata lagres og vises i et kompatibelt format.

juni Blender er en teknologi som evangelist på SAPIEN Technologies, Inc. Du kan nå henne på [email protected] eller følg henne på Twitter på @juneb_get_help.