Powershell Gui

Detta är en liten miniserie om att bygga GUI (grafical user interface) till dina PowerShell skript.


Bygga Powershell GUI

Del Beskrivning
Del 1 - Grunderna I denna del går vi igenom grunderna för att skapa ett enkelt GUI med PowerShell, inklusive hur man skapar fönster, knappar och textfält.
Del 2 - Händelsehantering Här lär vi oss hur man hanterar användarinteraktioner genom att koppla händelser till olika kontroller i GUI:t, såsom knapptryckningar och textinmatning.
Del 3 - Avancerade kontroller Denna del fokuserar på att använda mer avancerade kontroller som listvyer, flikar och menyer för att skapa mer komplexa och användarvänliga gränssnitt.
Del 4 - Stil och layout Här går vi igenom hur man anpassar utseendet på GUI:t genom att använda olika stilar, färger och layouter för att förbättra användarupplevelsen.
Del 5 - Distribution Den sista delen täcker hur man paketerar och distribuerar sitt PowerShell GUI-skript så att andra användare enkelt kan köra det på sina system.
Del 6 - GUI för att visa tjänster En GUI som visar aktiva tjänster på en dator och tillåter användaren att starta eller stoppa dem.



Del 1 - Grunderna

Del 1 - Grunderna

I denna del går vi igenom grunderna för att skapa ett enkelt GUI med PowerShell. Vi kommer att lära oss hur man skapar fönster, knappar och textfält.

Vad behövs?

PowerShell använder Windows Forms för att skapa GUI:t. Du behöver lägga till följande assemblies:

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")

Skapa ett enkelt fönster

Ett grundläggande GUI börjar med att skapa ett formulär:

$form = New-Object System.Windows.Forms.Form
$form.Text = "Min första GUI"
$form.Size = New-Object System.Drawing.Size(400, 300)
$form.ShowDialog()

Lägg till en knapp

$button = New-Object System.Windows.Forms.Button
$button.Text = "Klicka mig!"
$button.Location = New-Object System.Drawing.Point(150, 50)
$button.Size = New-Object System.Drawing.Size(100, 30)
$button.Add_Click({ [System.Windows.Forms.MessageBox]::Show("Knappen klickades!") })
$form.Controls.Add($button)

Lägg till ett textfält

$textbox = New-Object System.Windows.Forms.TextBox
$textbox.Location = New-Object System.Drawing.Point(50, 100)
$textbox.Size = New-Object System.Drawing.Size(300, 20)
$form.Controls.Add($textbox)

Fullt exempel

Här är ett komplett skript som sätter ihop allt:

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

$form = New-Object System.Windows.Forms.Form
$form.Text = "Min GUI"
$form.Size = New-Object System.Drawing.Size(400, 300)

$label = New-Object System.Windows.Forms.Label
$label.Text = "Skriv ditt namn:"
$label.Location = New-Object System.Drawing.Point(20, 20)
$form.Controls.Add($label)

$textbox = New-Object System.Windows.Forms.TextBox
$textbox.Location = New-Object System.Drawing.Point(20, 50)
$textbox.Size = New-Object System.Drawing.Size(300, 20)
$form.Controls.Add($textbox)

$button = New-Object System.Windows.Forms.Button
$button.Text = "Skicka"
$button.Location = New-Object System.Drawing.Point(20, 90)
$button.Add_Click({ 
    [System.Windows.Forms.MessageBox]::Show("Hej, $($textbox.Text)!")
})
$form.Controls.Add($button)

$form.ShowDialog()

Del 2 - Händelsehantering

Del 2 - Händelsehantering

Händelsehantering är nyckeln till att skapa interaktiva GUI:n. Det gör att ditt program kan reagera på användarens åtgärder.

Knapphändelser

Den vanligaste händelsen är när en knapp klickas:

$button.Add_Click({ 
    [System.Windows.Forms.MessageBox]::Show("Knappen klickades!")
})

Textfältshändelser

Du kan reagera när text ändras i ett textfält:

$textbox.Add_TextChanged({ 
    Write-Host "Texten är nu: $($textbox.Text)"
})

Formulärhändelser

Hantera när formuläret stängs eller laddas:

$form.Add_Load({ 
    Write-Host "Formuläret har öppnats"
})

$form.Add_FormClosing({ 
    Write-Host "Formuläret stängs"
})

Exempel: Validering

Här validerar vi inmatningen innan vi skickar den:

$button.Add_Click({ 
    if ([string]::IsNullOrWhiteSpace($textbox.Text)) {
        [System.Windows.Forms.MessageBox]::Show("Vänligen fyll i texten!")
    } else {
        [System.Windows.Forms.MessageBox]::Show("Hej, $($textbox.Text)!")
    }
})

Fullt exempel

Här är ett komplett skript med händelsehantering:

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

$form = New-Object System.Windows.Forms.Form
$form.Text = "Händelsehantering GUI"
$form.Size = New-Object System.Drawing.Size(400, 300)

$label = New-Object System.Windows.Forms.Label
$label.Text = "Skriv ditt namn:"
$label.Location = New-Object System.Drawing.Point(20, 20)
$form.Controls.Add($label)

$textbox = New-Object System.Windows.Forms.TextBox
$textbox.Location = New-Object System.Drawing.Point(20, 50)
$textbox.Size = New-Object System.Drawing.Size(300, 20)
$textbox.Add_TextChanged({
    Write-Host "Aktuell text: $($textbox.Text)"
})
$form.Controls.Add($textbox)

$button = New-Object System.Windows.Forms.Button
$button.Text = "Skicka"
$button.Location = New-Object System.Drawing.Point(20, 90)
$button.Add_Click({ 
    if ([string]::IsNullOrWhiteSpace($textbox.Text)) {
        [System.Windows.Forms.MessageBox]::Show("Vänligen fyll i texten!")
    } else {
        [System.Windows.Forms.MessageBox]::Show("Hej, $($textbox.Text)!")
    }
})
$form.Controls.Add($button)

$form.Add_Load({
    Write-Host "GUI är öppnad"
})

$form.ShowDialog()

Del 3 - Avancerade kontroller

Del 3 - Avancerade kontroller

I denna del utforskar vi mer avancerade kontroller som gör dina GUI:n mer kraftfulla och användarvänliga. Vi täcker listvyer, kombinationsrutor, flikar och menyer.

ListBox - Välja från en lista

En ListBox låter användaren välja ett eller flera objekt från en lista:

$listbox = New-Object System.Windows.Forms.ListBox
$listbox.Location = New-Object System.Drawing.Point(20, 50)
$listbox.Size = New-Object System.Drawing.Size(300, 100)
$listbox.Items.Add("Alternativ 1")
$listbox.Items.Add("Alternativ 2")
$listbox.Items.Add("Alternativ 3")
$form.Controls.Add($listbox)

ComboBox - Rullgardinsmeny

En ComboBox är en kompakt alternativ för att välja från en lista:

$combobox = New-Object System.Windows.Forms.ComboBox
$combobox.Location = New-Object System.Drawing.Point(20, 50)
$combobox.Size = New-Object System.Drawing.Size(300, 20)
$combobox.Items.Add("Alternativ 1")
$combobox.Items.Add("Alternativ 2")
$combobox.Items.Add("Alternativ 3")
$combobox.SelectedIndex = 0
$form.Controls.Add($combobox)

CheckBox - Alternativ som kan väljas

CheckBox:ar låter användaren välja flera oberoende alternativ:

$checkbox1 = New-Object System.Windows.Forms.CheckBox
$checkbox1.Text = "Aktivera loggning"
$checkbox1.Location = New-Object System.Drawing.Point(20, 50)
$checkbox1.Size = New-Object System.Drawing.Size(200, 20)
$form.Controls.Add($checkbox1)

$checkbox2 = New-Object System.Windows.Forms.CheckBox
$checkbox2.Text = "Spara resultat"
$checkbox2.Location = New-Object System.Drawing.Point(20, 80)
$checkbox2.Size = New-Object System.Drawing.Size(200, 20)
$form.Controls.Add($checkbox2)

RadioButton - Välja ett alternativ

RadioButton:s är bra när användaren endast kan välja ett alternativ:

$radio1 = New-Object System.Windows.Forms.RadioButton
$radio1.Text = "Alternativ A"
$radio1.Location = New-Object System.Drawing.Point(20, 50)
$radio1.Size = New-Object System.Drawing.Size(200, 20)
$form.Controls.Add($radio1)

$radio2 = New-Object System.Windows.Forms.RadioButton
$radio2.Text = "Alternativ B"
$radio2.Location = New-Object System.Drawing.Point(20, 80)
$radio2.Size = New-Object System.Drawing.Size(200, 20)
$form.Controls.Add($radio2)

DataGridView - Visa data i tabellformat

DataGridView är perfekt för att visa och redigera data i tabellformat:

$datagridview = New-Object System.Windows.Forms.DataGridView
$datagridview.Location = New-Object System.Drawing.Point(20, 50)
$datagridview.Size = New-Object System.Drawing.Size(500, 300)
$datagridview.AutoSizeColumnsMode = "AllCells"

# Lägg till kolumner
$datagridview.Columns.Add("Namn", "Namn")
$datagridview.Columns.Add("Ålder", "Ålder")

# Lägg till rader
$datagridview.Rows.Add("Adam", 30)
$datagridview.Rows.Add("Sofia", 28)

$form.Controls.Add($datagridview)

Fullt exempel - Avancerad GUI

Här är ett komplett skript som kombinerar flera avancerade kontroller:

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")

$form = New-Object System.Windows.Forms.Form
$form.Text = "Avancerad GUI"
$form.Size = New-Object System.Drawing.Size(600, 500)
$form.StartPosition = "CenterScreen"

# Label
$label = New-Object System.Windows.Forms.Label
$label.Text = "Välj ett alternativ från listan:"
$label.Location = New-Object System.Drawing.Point(20, 20)
$label.Size = New-Object System.Drawing.Size(200, 20)
$form.Controls.Add($label)

# ListBox
$listbox = New-Object System.Windows.Forms.ListBox
$listbox.Location = New-Object System.Drawing.Point(20, 50)
$listbox.Size = New-Object System.Drawing.Size(250, 100)
$listbox.Items.Add("PowerShell")
$listbox.Items.Add("Python")
$listbox.Items.Add("C#")
$listbox.Items.Add("JavaScript")
$form.Controls.Add($listbox)

# ComboBox
$comboLabel = New-Object System.Windows.Forms.Label
$comboLabel.Text = "Välj svårighet:"
$comboLabel.Location = New-Object System.Drawing.Point(20, 160)
$comboLabel.Size = New-Object System.Drawing.Size(100, 20)
$form.Controls.Add($comboLabel)

$combobox = New-Object System.Windows.Forms.ComboBox
$combobox.Location = New-Object System.Drawing.Point(20, 185)
$combobox.Size = New-Object System.Drawing.Size(250, 20)
$combobox.Items.Add("Lätt")
$combobox.Items.Add("Medel")
$combobox.Items.Add("Svår")
$combobox.SelectedIndex = 0
$form.Controls.Add($combobox)

# CheckBox
$checkbox = New-Object System.Windows.Forms.CheckBox
$checkbox.Text = "Aktivera debug-läge"
$checkbox.Location = New-Object System.Drawing.Point(20, 220)
$checkbox.Size = New-Object System.Drawing.Size(250, 20)
$form.Controls.Add($checkbox)

# Button
$button = New-Object System.Windows.Forms.Button
$button.Text = "Skicka"
$button.Location = New-Object System.Drawing.Point(20, 260)
$button.Size = New-Object System.Drawing.Size(100, 30)
$button.Add_Click({
    $selected = $listbox.SelectedItem
    $difficulty = $combobox.SelectedItem
    $debug = $checkbox.Checked
    
    $message = "Du valde: $selected`nSvårighet: $difficulty`nDebug: $debug"
    [System.Windows.Forms.MessageBox]::Show($message, "Resultat")
})
$form.Controls.Add($button)

# TextBox för resultat
$resultLabel = New-Object System.Windows.Forms.Label
$resultLabel.Text = "Resultat:"
$resultLabel.Location = New-Object System.Drawing.Point(20, 310)
$resultLabel.Size = New-Object System.Drawing.Size(100, 20)
$form.Controls.Add($resultLabel)

$resultBox = New-Object System.Windows.Forms.TextBox
$resultBox.Location = New-Object System.Drawing.Point(20, 335)
$resultBox.Size = New-Object System.Drawing.Size(550, 120)
$resultBox.Multiline = $true
$resultBox.ScrollBars = "Vertical"
$form.Controls.Add($resultBox)

# Lägg till lite logik
$listbox.Add_SelectedIndexChanged({
    $resultBox.Text += "Du valde: $($listbox.SelectedItem)`r`n"
})

$form.ShowDialog()



Del 4 - Stil och layout

Del 4 - Stil och layout

Att göra ditt GUI visuellt tilltalande är viktigt för användarupplevelsen. I denna del lär vi oss hur man anpassar färger, typsnitt och layout.

Ändra färger

Färger gör GUI:t mer intressant och kan hjälpa till att organisa information:

$form.BackColor = [System.Drawing.Color]::LightBlue
    $button.BackColor = [System.Drawing.Color]::DarkBlue
    $button.ForeColor = [System.Drawing.Color]::White
    $label.ForeColor = [System.Drawing.Color]::DarkGreen

Ändra typsnitt

Använd olika typsnitt för att framhöja text:

$label.Font = New-Object System.Drawing.Font("Arial", 14, [System.Drawing.FontStyle]::Bold)
    $button.Font = New-Object System.Drawing.Font("Verdana", 10)
    $textbox.Font = New-Object System.Drawing.Font("Courier New", 10)

Layout med GroupBox

Organisera kontroller i grupper med GroupBox:

$groupbox = New-Object System.Windows.Forms.GroupBox
    $groupbox.Text = "Användarinformation"
    $groupbox.Location = New-Object System.Drawing.Point(20, 20)
    $groupbox.Size = New-Object System.Drawing.Size(350, 150)

    $label = New-Object System.Windows.Forms.Label
    $label.Text = "Namn:"
    $label.Location = New-Object System.Drawing.Point(20, 30)
    $groupbox.Controls.Add($label)

    $textbox = New-Object System.Windows.Forms.TextBox
    $textbox.Location = New-Object System.Drawing.Point(80, 30)
    $textbox.Size = New-Object System.Drawing.Size(250, 20)
    $groupbox.Controls.Add($textbox)

    $form.Controls.Add($groupbox)

Layout med TabControl

Skapa flikar för att organisera innehål:

$tabControl = New-Object System.Windows.Forms.TabControl
    $tabControl.Location = New-Object System.Drawing.Point(20, 20)
    $tabControl.Size = New-Object System.Drawing.Size(550, 400)

    $tabPage1 = New-Object System.Windows.Forms.TabPage
    $tabPage1.Text = "Instäl​lningar"
    $tabPage1.BackColor = [System.Drawing.Color]::White

    $tabPage2 = New-Object System.Windows.Forms.TabPage
    $tabPage2.Text = "Om"
    $tabPage2.BackColor = [System.Drawing.Color]::White

    $tabControl.TabPages.Add($tabPage1)
    $tabControl.TabPages.Add($tabPage2)

    $form.Controls.Add($tabControl)

Fullt exempel - Stilig GUI

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")

    $form = New-Object System.Windows.Forms.Form
    $form.Text = "Stilig GUI"
    $form.Size = New-Object System.Drawing.Size(500, 400)
    $form.BackColor = [System.Drawing.Color]::WhiteSmoke
    $form.StartPosition = "CenterScreen"

    # Titel
    $title = New-Object System.Windows.Forms.Label
    $title.Text = "Mina Inställningar"
    $title.Font = New-Object System.Drawing.Font("Arial", 16, [System.Drawing.FontStyle]::Bold)
    $title.ForeColor = [System.Drawing.Color]::DarkBlue
    $title.Location = New-Object System.Drawing.Point(20, 20)
    $title.Size = New-Object System.Drawing.Size(300, 30)
    $form.Controls.Add($title)

    # GroupBox
    $groupbox = New-Object System.Windows.Forms.GroupBox
    $groupbox.Text = "Användardata"
    $groupbox.Location = New-Object System.Drawing.Point(20, 60)
    $groupbox.Size = New-Object System.Drawing.Size(450, 200)
    $groupbox.BackColor = [System.Drawing.Color]::White

    $label1 = New-Object System.Windows.Forms.Label
    $label1.Text = "Användarnamn:"
    $label1.Font = New-Object System.Drawing.Font("Arial", 10, [System.Drawing.FontStyle]::Bold)
    $label1.Location = New-Object System.Drawing.Point(20, 30)
    $groupbox.Controls.Add($label1)

    $textbox1 = New-Object System.Windows.Forms.TextBox
    $textbox1.Location = New-Object System.Drawing.Point(150, 30)
    $textbox1.Size = New-Object System.Drawing.Size(280, 20)
    $groupbox.Controls.Add($textbox1)

    $label2 = New-Object System.Windows.Forms.Label
    $label2.Text = "E-post:"
    $label2.Font = New-Object System.Drawing.Font("Arial", 10, [System.Drawing.FontStyle]::Bold)
    $label2.Location = New-Object System.Drawing.Point(20, 70)
    $groupbox.Controls.Add($label2)

    $textbox2 = New-Object System.Windows.Forms.TextBox
    $textbox2.Location = New-Object System.Drawing.Point(150, 70)
    $textbox2.Size = New-Object System.Drawing.Size(280, 20)
    $groupbox.Controls.Add($textbox2)

    $form.Controls.Add($groupbox)

    # Knapp
    $button = New-Object System.Windows.Forms.Button
    $button.Text = "Spara"
    $button.Location = New-Object System.Drawing.Point(20, 280)
    $button.Size = New-Object System.Drawing.Size(100, 40)
    $button.BackColor = [System.Drawing.Color]::DarkGreen
    $button.ForeColor = [System.Drawing.Color]::White
    $button.Font = New-Object System.Drawing.Font("Arial", 10, [System.Drawing.FontStyle]::Bold)
    $button.Add_Click({
        [System.Windows.Forms.MessageBox]::Show("Inställningar sparade!", "Info")
    })
    $form.Controls.Add($button)

    $form.ShowDialog()
Del 5 - Distribution

Del 5 - Distribution

När ditt PowerShell GUI-skript är klart vill du ofta dela det med andra. Här lär vi oss hur man paketerar och distribuerar skriptet på ett professionellt sätt.

Signering av skript

För säkerhet kan du signera ditt skript digitalt:

Set-AuthenticodeSignature -FilePath "myscript.ps1" -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0]

Skapa en körbar EXE-fil

Använd PS2EXE för att konvertera ditt PowerShell-skript till en EXE-fil:

PS2EXE.ps1 -inputFile "gui-script.ps1" -outputFile "gui-script.exe"

Paketera med en installer

Skapa en installerscript som användare kan köra:

$installPath = "C:\Program Files\MyGUI"
    if (-not (Test-Path $installPath)) {
        New-Item -ItemType Directory -Path $installPath -Force
    }
    Copy-Item "gui-script.ps1" -Destination "$installPath\gui-script.ps1"
    Write-Host "Installation klar! Skriptet finns i $installPath"

Skapa en genväg på skrivbordet

Gör det enkelt för användare att starta skriptet:

$desktopPath = [System.IO.Path]::Combine([System.Environment]::GetFolderPath("Desktop"))
    $shortcutPath = "$desktopPath\Min GUI.lnk"
    $shell = New-Object -ComObject WScript.Shell
    $shortcut = $shell.CreateShortcut($shortcutPath)
    $shortcut.TargetPath = "powershell.exe"
    $shortcut.Arguments = "-ExecutionPolicy Bypass -File C:\Program Files\MyGUI\gui-script.ps1"
    $shortcut.Save()

Dokumentation och versionering

Inkludera alltid en README-fil och version-information:

# Version: 1.0
    # Författare: Adam
    # Beskrivning: En GUI för att hantera PowerShell-uppgifter
    # Krav: PowerShell 5.0 eller senare, Windows Forms

    $version = "1.0"
    Write-Host "Min GUI v$version"

Distribution via GitHub eller ZIP

Distribuera ditt projekt på GitHub eller som en ZIP-fil:

Compress-Archive -Path "gui-script.ps1", "README.md", "install.ps1" -DestinationPath "MyGUI.zip"

Bästa praxis

  • Testa ditt skript på andra datorer innan distribution
  • Inkludera en installerscript för enkel installation
  • Signera ditt skript för att öka förtroendet
  • Skriv tydlig dokumentation
  • Versionshantera ditt projekt med Git
  • Tillhandahåll support-kontakt eller ett issue-spårningssystem

GUI för att visa tjänster

Skapde denna till en kolega som ville ha ett GUI i PowerShell för att se vilka tjänster som är aktiva

linux desktop
Ladda ner Script
⬅ Tillbaka