Grafisk klokke vha Powershell på 5 linjer og andre scripts

Powershell Pack har vært ute en liten stund og jeg har fått tid til å kikke litt på den. Denne posten dreier seg om de nye mulighetene der for å lage grafisk grensesnitt med Powershell og Windows Presentation Foundation. Dette er jo mulig uten denne pakka også, men langt lettere nå.

 

For å komme i gang

Det første du bør gjøre er å laste ned og installere powershell pack.

Det obligatoriske Hello World eksempelet er rimelig lett. Merk at alt her gjøres i Powershell ISE eller PS console startet med argumentet –Sta (dvs powershell.exe –Sta). WPF må kjøre i denne modusen for å rendre gui definert med XAML.

    1: import-module powershellpack
    2: import-module wpk
    3:  
    4: new-label "Hallo Alle Sammen" -show

image

Så langt ikke spesielt vanskelig, men kanskje heller ikke spesielt nyttig… Det finnes langt mer man kan gjøre og formatere med new-label. Kjør help new-label, ganske overveldende antall paramtere, inkludert events som MouseOver etc.

    1: New-Label “Hello, World” -FontSize 48 -AsJob 

Linja over vill vise et vindu med større tekst og som en bakgrunnsprosess, uten å blokkere scriptets gang videre.

image

 

Litt mer avansert

Som sagt kan man legge til events også, noe som jo er en nødvendighet om man skal kunne bruke dette til noe annet enn å vise meldinger. Dette er også veldig enkelt.

    1: function popup($text){
    2: new-label $text -show -fontsize 42 -on_mouseup {popup("Og absolutt ikke her!")}
    3: }
    4:  
    5: New-Label “Ikke klikk her” -Show -FontSize 48 -on_mouseup {popup("Ikke her heller")} -background "#00ff00"

Scriptet over definerer en funksjon først, som ikke gjør stort annet enn å vise en ny popup. Den første popupen scriptet her viser er siste linja og denne har en event koblet til MouseUp.

image

Resultatet blir omtrent som til høyre om du klikker på den første og den andre boksen.

 

 

 

Mange av introduksjonene til WPK bruker følgende eksempel for å lage en enkel klokke på 5 linjer. (joda, det kan lett omformateres til enda færre)

    1: New-Label -FontSize 24 -On_Loaded {
    2:     Register-PowerShellCommand -scriptBlock {     
    3:         $window.Content.Content = (Get-Date | Out-String).Trim()
    4:     }-run -in "0:0:0.5"
    5: } -AsJob

Register-Powershellcommand er en cmdlet inkludert i WPK modulen. Den kjører en kommando i en gitt kontekst. –Run kjører kommandoen med en gang, mens –in angir hvor ofte den skal kjøres. I dette tilfellet annehvert sekund.

Parametere/variable det kan være greit å vite om

$_

Som ellers i Powershell, dette er gjeldende element, også i WPF sammenheng.  Ved eventhåndtering inneholder denne argumentene som er sendt med til eventhandler.

$this

Ved eventhåndtering er dette objektet der eventet kommer fra

$window

Denne referer alltid til vinduet som viser de aktuelle WPF objektene. Se eksempelet over.

Enda litt mer avansert

Scriptet under lager et vindu og plasserer ut labels, textinput og en knapp. Inputen blir eksevert som en powershell kommando når du trykker på knappen. Merk at funksjonen for å formatere resultatet er tom her, så vellykkete operasjoner gir deg kun objekttypen som resultat.

    1: import-module WPK
    2:  
    3: function formatres($in){
    4:  
    5: return $in
    6: }
    7:  
    8: $grid = new-grid -rows 2 -columns 'auto','1*' -height 100 -width 200 {
    9:  
   10: $go = {
   11: $commandstr = Get-Resource Cmd | Select-Object -ExpandProperty Text
   12:  
   13: try {
   14: $command = [scriptblock]::Create($commandstr)
   15: $res = invoke-command -scriptblock $command
   16: $out = formatres($res)
   17: }
   18: catch {
   19: $out = $_
   20: }
   21: new-label $out -show 
   22:  
   23: }
   24:  
   25: New-Label "kommando" -row 0 -column 0
   26: new-textbox -Name Cmd -row 0 -column 1 -height 30 -on_loaded {
   27: set-resource -Name Cmd -Value $this -Depth -1
   28: $this.Focus()
   29: }
   30: new-button "Kjør" -row 1 -column 1 -height 30 -on_Click $go
   31: } -show
   32:  

Det opprettes først et nytt grid basert vindu med 2x2 grid. –Row 2 betyr at det lages to rows med samme størrelse. Kolonnene som lages her er første satt til Auto størrelse og den andre til 1 x gjenværende størrelse. Du kan evt også bare angi pixels.

Andre ting som er verdt å kommentere er vel Set-resource, gjøres for at textbox skal være en navngitt ressurs lett tilgjengelig med Get-resource, brukes på linje 11.

Linje 10 og 30 sammen viser en enkel måte å skille ut scriptblocks i variable for å gjøre opprettelsen av knappen litt mer strømlinjeforma. Gjør det lett å gjenbruke samme eventhandler om du f.eks vil håndtere når brukeren trykker på Enter i tekstfeltet også.

IMO: Minner meg veldig om andre gamle scriptspråk jeg laget GUI med, definere grid’er og plassere med koordinater osv.