Articles

SAPIEN Technologies (Svenska)

Efter många års skrivskript för Windows PowerShell — konsolen lär jag mig nu nästa nivå av automatiseringsskrivande GUI-applikationer som kör Windows PowerShell-kommandon. PowerShell Studio former ger en mild och välstyrd introduktion till GUI-applikationer, men det har fortfarande tagit mig lite tid att bryta gamla vanor.

jag måste ständigt påminna mig om att saker som ”bara fungerar” i konsolen inte ger någon mening i ett GUI. Skrivutgång är en av dem.,

skriva utdata till konsolen

När du genererar utdata i Windows PowerShell-konsolen visas utdata som textsträngar i konsolfönstret.

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

bakom kulisserna lägger Windows PowerShell tyst ett Out-String-kommando till rörledningen och skickar resultaten till ”standard output” (”stdout”). Processen som är värd för Windows PowerShell hanterar standardutgången, nästan alltid genom att skriva utdata till konsolen (värd beteende kan variera).,

så, om du kör en cmdlet som returnerar objekt, till exempel Get-Process cmdlet, (sträng representationer av) visas objekten i konsolen.

om du formaterar objekt, till exempel genom att använda Format-lista eller Format-Tabell, visas de formaterade objekten i konsolen.

om du kör Write-Host eller Write-Output, out-Host eller Out-String visas utmatningssträngarna i konsolen.

och även om du skickar utdata till en alternativ utmatningsström genom att använda Skrivvarning, Skrivverbose eller skrivfel, visas utmatningen som standard i konsolen.,

men GUI-programmet har ingen konsol. Vad händer med utgången som annars skulle gå till konsolen när det inte finns någon konsol? Och ännu viktigare, hur hanterar jag utmatning utan en konsol?

Var är min utgång?

GUI-program, som de coola som du skriver i PowerShell Studio, har ingen konsol. Det finns ingen standard utgång. Det finns ingen automatisk bifogad Out-String.

så, när du genererar utdata och inte sparar den till en fil eller en variabel, är utmatningen bara förlorad.,

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

det är som en kanna som kastar en baseball när det inte finns någon catcher på fältet. Bollen faller bara till marken och rullar till ett stopp .. ignorera.

så i ett GUI-program kan du inte bara skriva ut och hoppas på det bästa. Om du vill visa cmdlet utgång eller spara den, måste du göra det uttryckligen.

visa utdata i en textruta

ett GUI-program är en samling kontroller. För att visa utdata måste du tilldela utmatningen till en kontroll, till exempel textruta, rich text box eller ett datanät.,

om du till exempel vill visa namnet på den lokala datorn i konsolen kör du kommandot $env:ComputerName.

PS C:> $env:ComputerNameJUNEB-TESTBOX

När jag försöker samma sak i ett GUI-program där det inte finns någon konsol ser jag inget resultat alls. I det här exemplet skapade jag ett formulär med en knapp som, när den klickas, kör uttrycket $env:ComputerName.,

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

men när jag klickar på knappen händer ingenting, även om jag har ett konsolfönster öppet.

för att visa datorns Namn i ett GUI-program lägger jag till en visningskontroll i min form och tilldelar kommandoutgången till en metod för visningskontrollen.,

till exempel kan jag lägga till en Textrutakontroll i formuläret och använda tilldelningsoperatören (=) för att tilldela resultatet av uttrycket till textegenskapen i textrutan. Nu, när du klickar på knappen, ser du utgången i textrutan.

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

här är resultatet:

visa utdata i ett annat Program

Du kan också visa utdata från kommandon i objekt som inte ingår i ditt program., GUI-proffs tror att detta tillvägagångssätt är slarvigt och inte en bästa praxis, men du kanske tycker att det är användbart för testning eller felsökning.

Du kan t.ex. leda utsignalen till cmdlet Out-GridView.

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

här är resultatet:

Du kan också skriva till en fil och öppna filen.filen. Dessa exempelkommandon skapar en tillfällig fil, skriver till filen och använder sedan anteckningsblock för att visa filen., Återigen, detta gör riktiga programmerare krypa, men det fungerar, åtminstone för testning.

här är resultatet:

konvertera till strängar

en annan uppgift som du behöver hantera i ett GUI-program konverterar objekt till textsträngar. Vanligtvis innebär detta bara rör din utgång till en ut cmdlet, såsom Out-sträng. Ut cmdlets, inklusive Out-GridView, konvertera objekt till strängdata.

När du skriver utdata till konsolen lägger Windows PowerShell automatiskt ett Out-String-kommando till rörledningen., Men det finns ingen konsol och ingen automatisk Utsträng i ett GUI-program.

När du tilldelar icke-strängobjekt till ett strängobjekt eller till en kontroll som tar strängobjekt, till exempel en textruta, anropar Windows PowerShell toString () – metoden för objektet. (På andra språk skulle uppdraget bara misslyckas, men det försöker hjälpa till.) Med vissa objekt, såsom DateTime och ErrorRecord objekt, toString() fungerar bra, men i många fall, det ger udda utseende resultat.

det här kommandot tilldelar till exempel resultatet av ett Get-Process-kommando till en textruta., Windows PowerShell erkänner att du behöver text och kallar toString () – metoden för processobjekt, men resultatet är inte användbart.

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

för att få en strängrepresentation av standardprocesstabellen, rör utmatningen till utsträngen cmdlet och tilldela den sedan till textrutan.

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

tips: för att göra utmatningen lättläst, Ställ in textrutan (eller rich textrutan) för att använda ett monospace-teckensnitt. Högerklicka på textrutan i PowerShell Studio, klicka på Apply Property Set och klicka sedan på Apply Console Font.

undvik inte toString() helt. Det finns några objekt där toString () – metoden ger ett användbart resultat. Datetime-objekt är det klassiska exemplet. ToString () – metoden för ett DateTime-objekt returnerar en formatsträng” short-date/long-time”. Out-String returnerar ett” long-date/long-time ” – 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

#använder toString()$buttonGetDate_Click = { $textboxDate.Text = Get-Date}

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

Du kan också använda parametrarna Format och UFormat för Get-Date cmdlet för att få en formaterad datumsträng i nästan vilken konfiguration som helst., Till exempel, för att få ett datum i RFC1123 format använd Format R (eller ”r”). Inget behov av att pipa till Out-String när du använder Format eller UFormat, eftersom dessa parametrar tvingar cmdlet att returnera en sträng.

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

konvertera formaterade objekt

i konsolen, format cmdlets, såsom Format-Tabell, är vanligtvis det sista elementet i en rörledning. Produktionen ser bra ut i konsolen, eftersom Windows PowerShell lägger en Sträng befallning till ledningen innan du skickar det till konsolen.,

men i ett GUI-program får du som standard resultatet av att du anropar toString () – metoden för de formatobjekt som formatet cmdlets returnerar.

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

för att få en mer användbar skärm i ditt GUI-program, rör formatobjekten till utsträngen cmdlet innan du tilldelar dem textegenskapen i textrutan.,

det är bättre!

efter ett tag blir uppgiften att hantera utmatningsdisplayen i dina GUI-applikationer lika naturlig som att skriva ett cmdlet-namn, men när du lär dig, var noga med att testa och se till att alla dina utdata fångas och visas i ett användbart format.

juni Blender är en teknik som evangelist på SAPIEN Technologies, Inc. Du kan nå henne på [email protected] eller följ henne på Twitter på @ juneb_get_help.