Kategorie:

Okienkowe skrypty, czyli GUI w PowerShellu cz 1

PowerShell ze względu na to, że bazuje na technologii .NET pozwala oprócz skryptów w formie konsolowej, tworzyć nie tyle bardziej zaawansowanych, co przyjemniejszych dla oka skryptów w formie graficznej. Można to zrealizować na dwa sposoby, albo za pośrednictwem Windows Forms, albo Windows Presentation Framework. W tej serii opiszę Wam jak wykorzystać tą pierwszą metodę. Będziemy korzystać z wbudowanego w system edytora ISE. Jednym z przykładów zastosowania może być sytuacja, w której będzie korzystać z Waszego skryptu osoba nie koniecznie znająca PowerShella.

Zacznijmy od stworzenia pierwszej formatki, do tego wystarczy zaledwie 4 linie kodu:
Zdefiniowanie klasy .NET:

PowerShell
Add-Type -AssemblyName System.Windows.Forms

Utworzenie obiektu formatki

PowerShell
$Form = New-Object System.Windows.Forms.Form

Zdefiniowanie tytułu

PowerShell
$Form.Text = "Hello World!"

Wyświetlenie formatki:

PowerShell
$Form.ShowDialog()

Wystarczy zaledwie tyle aby wygenerować prostą, pustą (na razie) formatkę:

Po uruchomieniu skryptu przywita nas pierwsza formatka:

Jak wspomniałem na początku Powershell jest oparty na .NET mamy do dyspozycji te same właściwości formatki co, np w C#, możemy zatem zdefiniować dla niej konkretne właściwości, takie jak np: rozmiar, kolor tła, przyciski maksymalizacji, minimalizacji, położenie po starcie i wiele innych. Wszystkie właściwości znajdziecie tutaj.

Dodajmy zatem do naszej formatki na początek zdefiniowaną wielkość okna

PowerShell
$Form.Size = New-Object System.Drawing.Size(640,480)

Oraz zablokujmy możliwość zmiany wielkości okna

PowerShell
$Form.FormBorderStyle = "Fixed3D"

W ten oto sposób możemy dopasować okienko do własnych potrzeb.
Przejdźmy zatem do dodania do formatki dodatkowych obiektów. Zacznijmy od najprostszego, ale jednocześnie często stosowanego – etykiety (Label). Pozwala ona na wprowadzanie opisów, np. pól tekstowych, pól jedno- i wielokrotnego wyboru, itp.
Aby dodać do naszej formatki etykietę wystarczy utworzyć nowy obiekt, nadać mu niezbędne atrybuty, po czym dodać do formatki.

PowerShell
$Label = New-Object System.Windows.Forms.Label
$Label.Text = "Wprowadź tekst:"
$Label.Size = New-Object System.Drawing.Size(100,25)
$Label.Location = New-Object System.Drawing.Size(15,15)

$Form.Controls.Add($Label)

Wystarczy tyle aby wyświetlić etykietę, czyli: utworzenie obiektu, dodanie wyświetlanego tekstu, zdefiniowanie rozmiaru oraz lokalizacji na formatce. I na koniec dodanie obiektu etykiety do naszej formatki. Nic nie stoi na przeszkodzie, aby dostosować czcionkę do naszych potrzeć, użyć pogrubionej, czy też ją zmienić na inną

PowerShell
$Label.Font = New-Object System.Drawing.Font("SegoeUI",8.25,[System.Drawing.FontStyle]::Bold)
$Label.ForeColor = [System.Drawing.Color]::Red

W taki sposób możemy konstruować coraz bardziej złożone formatki w zależności od naszych potrzeb. W tym poście do naszego Formsa dodamy jeszcze pole tekstowe (TextBox) i przycisk (Button). Oba obiekty dodajemy w podobny sposób jak etykietę, tylko definiując obiekt wybieramy odpowiednio TextBox i Button.

PowerShell
$TextBox = New-Object System.Windows.Forms.TextBox
$TextBox.Text = "Wprowadź tekst"
$TextBox.Size = New-Object System.Drawing.Size(120,25)
$TextBox.Location = New-Object System.Drawing.Size(115,11)

$Form.Controls.Add($TextBox)

Podobnie postępujemy z przyciskiem.

PowerShell
$Button = New-Object System.Windows.Forms.Button
$Button.Text = "OK"
$Button.Size = New-Object System.Drawing.Size(100,25)
$Button.Location = New-Object System.Drawing.Size(55,40)

$Form.Controls.Add($Button)

Już na sam koniec, dodajmy najprostszą akcję do przycisku w postaci wyskakującego okienka, które będzie wyświetlało tekst wprowadzony do pola tekstowego. Niestety w edytorze ISE nie działa podpowiadanie składni dla zdarzeń obiektów, więc nie zawsze można ich w oczywisty sposób użyć.
Ja skorzystam ze zdarzenia Add_Click, które to po kliknięciu na przycisk wywoła akcję wyświetlenia okienka (MessageBox)

Tutaj mała uwaga: w zależności ile parametrów użyjemy możemy uzyskać inne rezultaty. Jeden parametr, wyświetli po prostu tekst, kolejny doda do niego tytuł, kolejny ikonę, przyciski, pomoc, itp.). Szczegółowy opis w dokumentacji

PowerShell
$Button.Add_Click({
    [System.Windows.Forms.MessageBox]::Show($TextBox.Text, "Tytuł", "OK", "Information")
})

W moim przykładzie są to kolejno: komunikat pobierany z pola tekstowego, tytuł, jeden przycisk OK, oraz ikona informacyjna.

W ten oto sposób mamy utworzoną najprostszą formatkę z obiektami oraz podstawową akcją. W kolejnej części pokażę inne obiekty i bardziej zaawansowane akcje, które można wykorzystać we własnych programach. Jeśli chcecie poruszyć jakieś tematy z dziedziny np. PowerShella, zostawcie komentarz.

Na koniec link do pliku zawierającego cały kod z tej części

EDIT —> 2-ga część wpisu dot. tworzenia skryptów z interfejsem okienkowym – Link 🙂