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ällningar"
$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
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