Zum Inhalt springen

PS1 in EXE umwandeln: Vom PowerShell-Script zum Programm

Schlagwörter:

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.

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:

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

Benutzeroberfläche erstellen

Im Visual Studio wird hierfür ein neues Projekt aus der Projektvorlage WPF-Anwendung erzeugt:

Visual Studio: Neue WPF-Anwendung erstellen

Aus Kompatibilitätsgründen sollte .NET Core 3.1 (Langfristige Unterstützung) verwendet werden:

Visual Studio: .NET-Zielframework für WPF-Anwendung auswählen

Jetzt kann die Benutzeroberfläche gebaut werden:

Visual Studio 2019: WPF XAML GUI gestalten

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-NullCode-Sprache: PHP (php)

Das Beispielprogramm

Das PowerShell-Script aus dem vorhergehenden Abschnitt erzeugt eine grafische Benutzeroberfläche mit Textbox und Buttons:

PS1 in EXE umwandeln - PowerShell-Beispiel-Programm

Name eingeben, Starten, Info-Messagebox mit persönlicher Begrüßung wird angezeigt:

PowerShell-Beispiel-Programm: Messagebox

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.

Virustotal.com PS2EXE Virus

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

2 × 2 =