PS1 in EXE umwandeln, gelingt in einigen wenigen Schritten, setzt aber ein solides Grundwissen bzw. Verständnis im Umgang mit PowerShell und der Erstellung von Benutzeroberflächen voraus.
Inhaltsverzeichnis
PS1 in EXE umwandeln: Vom PowerShell-Script zur Desktopanwendung
PowerShell-Scripts (.ps1) können relativ schnell mit dem PowerShell-Modul PS2EXE in eine Windows Desktopanwendung (.exe) konvertiert werden. Die Benutzeroberfläche (GUI) kann mit Windows Presentation Foundation (WPF) und Extensible Application Markup Language (XAML) im Visual Studio erzeugt werden. Die Benutzeroberfläche ist aber nicht zwingend erforderlich, es kann auch eine reine Konsolenanwendung erstellt werden.
Ablauf
Der Weg vom Script zur Desktopanwendung könnte wie folgt sein:
- PowerShell-Script in PowerShell ISE oder Visual Studio Code (kostenlos) entwickeln
- Benutzeroberfläche in Visual Studio Community Edition (kostenlos) erstellen
- PowerShell-Script und Benutzeroberfläche verbinden (Daten-Ein/Ausgabe, Fehlermeldungen…)
- PowerShell-Script mit PS2EXE (kostenlos) in .EXE umwandeln
Einsatzzweck
Die Kommunikation zwischen PowerShell und Elementen der Benutzeroberfläche kann aber schnell kompliziert werden. Kleine Anwendungen und Tools lassen sich aber trotzdem mit überschaubarem Aufwand erstellen. Umfangreichere Windows-Software wird aber trotzdem noch immer mit einer echten Programmiersprache programmiert werden müssen.
Benutzeroberfläche für PowerShell-Script erstellen
Typischerweise werden PowerShell-Scripts mit der Windows PowerShell ISE oder dem Visual Studio Code entwickelt. Leider lässt sich mit beiden Entwicklungstools keine Benutzeroberfläche zusammenstellen. Mit Visual Studio, gelingt dies aber mit wenigen Mausklicks. Glücklicherweise genügt dafür auch die kostenlose Visual Studio Community Edition.
GUI-Entwicklungsumgebung installieren
- Visual Studio Community herunterladen
- Visual Studio Community für .NET-Desktopentwicklung installieren:
Benutzeroberfläche erstellen
Im Visual Studio wird hierfür ein neues Projekt aus der Projektvorlage WPF-Anwendung erzeugt:
Aus Kompatibilitätsgründen sollte .NET Core 3.1 (Langfristige Unterstützung) verwendet werden:
Jetzt kann die Benutzeroberfläche gebaut werden:
Benutzeroberfläche in PowerShell-Script verwenden
Nachdem die Benutzeroberfläche im Visual Studio erstellt wurde, muss der XAML-Code kopiert und im nachstehenden PowerShell-Script entsprechend eingefügt und verwendet werden. Dazu wird im Abschnitt ### XAML-Code ### der erstellte XAML-Code zwischen @“ und „@ in der Variable $inputXML eingefügt. Die Benutzeroberflächen-Elemente (Textbox, Buttons…) werden über $WPF…-Variablen mit PowerShell verwendbar (siehe Beispiel).
Im ### PowerShell ### Bereich kann das eigentliche PowerShell-Script mit den üblichen Cmdlets platziert werden und auch mit der Benutzeroberfläche kommuniziert werden (Daten-Ein/Ausgabe).
Am Ende wird die Benutzeroberfläche im Bereich ### Show Window ### geladen.
Zu Test- und Entwicklungszwecken kann der Code nun einfach in der PowerShell ISE ausgeführt werden. Die Benutzeroberfläche wird in einem neuen Programmfenster dargestellt. Die Konvertierung in eine Anwendung bzw. .exe-Datei ist dafür nicht zwingend notwendig.
################### XAML-Code ###################
$inputXML = @"
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="Beispiel-Programm" Height="200" Width="300" ResizeMode="NoResize" WindowStartupLocation="CenterScreen">
<Grid>
<TextBlock HorizontalAlignment="Left" Margin="21,19,0,0" TextWrapping="Wrap" VerticalAlignment="Top"><Run Text="Willkommen im PowerShell-Programm"/><Run Language="de-de" Text="!"/></TextBlock>
<Label Content="Name:" HorizontalAlignment="Left" Margin="18,53,0,0" VerticalAlignment="Top"/>
<TextBox x:Name="textbox" HorizontalAlignment="Left" Margin="67,57,0,0" Text="" TextWrapping="Wrap" VerticalAlignment="Top" Width="181"/>
<Button x:Name="Starten" Content="Starten" HorizontalAlignment="Left" Margin="21,101,0,0" VerticalAlignment="Top" IsDefault="True" Width="76" Height="27"/>
<Button x:Name="Beenden" Content="Beenden" HorizontalAlignment="Center" Margin="0,101,0,0" VerticalAlignment="Top" Width="76" Height="27"/>
</Grid>
</Window>
"@
############### Parse and use XAML ###############
$inputXML = $inputXML -replace 'mc:Ignorable="d"','' -replace "x:N",'N' -replace '^<Win.*', '<Window'
[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
[xml]$xaml = $inputXML
$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$Form=[Windows.Markup.XamlReader]::Load( $reader )
#$xaml.SelectNodes("//*[@Name]") | ForEach-Object { Set-Variable -Name "WPF$($_.Name)" -Value $Form.FindName($_.Name) }
$xaml.SelectNodes("//*[@Name]") | %{Set-Variable -Name "WPF$($_.Name)" -Value $Form.FindName($_.Name)}
################### PowerShell ###################
# Button "Starten"
$WPFstarten.Add_Click({
# Info anzeigen
[System.Windows.Forms.MessageBox]::Show("Willkommen "+$WPFtextbox.Text+"!","Willkommen",0,[System.Windows.Forms.MessageBoxIcon]::Information)
# Textbox-Text ändern
$WPFtextbox.Text = ''
})
# Button "Close"
$WPFbeenden.Add_Click({
$form.Close()
})
################## Show Window ###################
$form.ShowDialog() | Out-Null
Code-Sprache: PHP (php)
Das Beispielprogramm
Das PowerShell-Script aus dem vorhergehenden Abschnitt erzeugt eine grafische Benutzeroberfläche mit Textbox und Buttons:
Name eingeben, Starten, Info-Messagebox mit persönlicher Begrüßung wird angezeigt:
PowerShell-Script in eine Anwendung konvertieren
PowerShell-Modul „PS2EXE“
Mit dem PowerShell-Modul PS2EXE lässt sich ein PowerShell-Script mit einem Befehl in eine Anwendung bzw. .exe konvertieren. Dafür muss aber zunächst PS2EXE installiert werden:
Install-Module ps2exe -Force
In diesem Beispiel wird Beispiel.ps1 zu Beispiel.exe:
Invoke-PS2EXE C:\Test\Beispiel.ps1 C:\Test\Beispiel.exe -noConsole -title "Beispiel-Programm" -description "Test" -company "Anreiter.at" -product "Beispiel-Programm" -copyright "Anreiter.at" -version "1.0"
Code-Sprache: JavaScript (javascript)
Mehr zu PS2EXE auf Github
PS2EXE erstellte .EXE und Virenscanner
Bei Virustotal.com kann die mit PS2EXE erstellte .EXE-Datei auf Viren geprüft werden. Seitdem irgendjemand mit PS2EXE eine Ransomware erstellt hat, erscheint aktuell bei jeder PS2EXE generierten .EXE eine Warnmeldung. 16 von 68 AntiVirus-Produkte erkennen die .EXE derzeit als Virus. Leider sind mit BitDefender und GData aktuell auch populäre Hersteller von dieser Fehleinschätzung betroffen.
Alternative: Sapien PowerShell Studio
Das Sapien PowerShell Studio vereint PowerShell-Entwicklung, Benutzeroberflächen-Erstellung und EXE-Konvertierung in einem Programm, ist aber nicht kostenlos und für Gelegenheitsentwickler vielleicht etwas zu teuer.
Setup.exe mit Inno Setup erstellen
Zu guter Letzt kann die erstellte Anwendung bei Bedarf auch noch in einem Setup verpackt werden. Schnell und kostenlos gelingt das mit Inno Setup. Dieser Vorgang wird in einem eigenen Beitrag erklärt.