Detta är en liten miniserie om att bygga GUI (grafical user interface) till dina PowerShell skript.
| 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. |
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.
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")
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()
$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)
$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)
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()
Händelsehantering är nyckeln till att skapa interaktiva GUI:n. Det gör att ditt program kan reagera på användarens åtgärder.
Den vanligaste händelsen är när en knapp klickas:
$button.Add_Click({
[System.Windows.Forms.MessageBox]::Show("Knappen klickades!")
})
Du kan reagera när text ändras i ett textfält:
$textbox.Add_TextChanged({
Write-Host "Texten är nu: $($textbox.Text)"
})
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"
})
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)!")
}
})
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()
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.
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)
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: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: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 ä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)
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()
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.
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
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)
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)
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)
[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()
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.
För säkerhet kan du signera ditt skript digitalt:
Set-AuthenticodeSignature -FilePath "myscript.ps1" -Certificate (Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert)[0]
Använd PS2EXE för att konvertera ditt PowerShell-skript till en EXE-fil:
PS2EXE.ps1 -inputFile "gui-script.ps1" -outputFile "gui-script.exe"
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"
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()
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"
Distribuera ditt projekt på GitHub eller som en ZIP-fil:
Compress-Archive -Path "gui-script.ps1", "README.md", "install.ps1" -DestinationPath "MyGUI.zip"