Hallo Leser,

heute möchte ich die Frage beantworten dich mich des Öfteren erreicht hat: „Wie machst du aus deinem PowerShell-Skript eine ausführbare EXE-Datei?“.

Ausgangslage ist eine kleines Script auf meinem PC welches ein Fenster anzeigen lässt (Bild 1):

#Script dient als Beispiel für PS2EXE"
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
 [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
 [void][reflection.assembly]::Load("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
 [void][reflection.assembly]::Load("System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
 [void][reflection.assembly]::Load("System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
 [void][reflection.assembly]::Load("System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
 [void][reflection.assembly]::Load("System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
 [void][reflection.assembly]::Load("System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
 [void][reflection.assembly]::Load("System.DirectoryServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
 [void][reflection.assembly]::Load("System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
 [void][reflection.assembly]::Load("System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
#Eine Funktion für den Button erstellen
 function ende { $Fenster1.Close() }
#Ein Fenster Erstellen
 $Fenster1 = New-Object System.Windows.Forms.Form
 $Fenster1.Size = New-Object System.Drawing.Size(400,400)
 $Fenster1.MaximumSize = "400,400"
 $Fenster1.MinimumSize = "400,400"
 $Fenster1.Text = "Fenster als Beiepiel"
 $Fenster1.StartPosition = "CenterScreen"
 $Fenster1.BackColor = "#B2E4FF"
 $Fenster1.Icon = $Icon
 $Fenster1.Font = $Font
 $Fenster1.WindowState = "Normal"
#Ein Button in dem Fenster erstellen
 $Ende = New-Object System.Windows.Forms.Button
 $Ende.Location = New-Object System.Drawing.Size(140,125)
 $Ende.Size = New-Object System.Drawing.Size(100,100)
 $Ende.Text = "Fenster schließen"
 $Ende.TabIndex = 5
 $Ende.BackColor = "white"
 $Ende.Add_Click({ende})
 $Fenster1.Controls.Add($Ende)
#Fenster anzeigen lassen
 [System.Windows.Forms.Application]::Run($Fenster1)
 [System.Windows.Forms.Application]::EnableVisualStyles()
 [System.Windows.Forms.Application]::DoEvents()
 $Fenster1.Add_Shown({$Fenster1.Activate()})

 

Das Script liegt im Ordner P:\Scripts\PS2Exe\sample.ps1.

Folgendes wird zusätzlich benötigt:

Im Scriptverzeichnis existiert zudem für jedes der beiden Tools ein Unterverzeichnis.

PowerShell to EXE – der erste Schritt

Damit ich nun die PS1 zu einer EXE-zaubern kann muss ich ebenfalls ein PowerShell-Script ausführen (Bild 2):

P:\Scripts\PS2EXE\PS2EXE_0.5.0.0.0\ps2exe.ps1 -inputFile P:\Scripts\PS2EXE\sample.ps1 -outputFile P:\Scripts\PS2EXE\sample.exe -sta -noConsole -runtime40 -verbose -x64

Damit ist die EXE erstellt und funktioniert!

 Wird bereits die PowerShell 5.0 verwendet schlägt das Script fehl (Bild 3). Es muss zusätzlich um die PS 5.0 erweitert werden! (Bild 4

Attribute zur EXE Datei hinzufügen – Schritt 2

Damit das EXE-File auch um zusätzliche Attribute erweitert werden kann benötige ich das zweite Tool. Zunächst sieht es folgendermaßen aus:

Bild 5 - EXE Details

  1. Produktversion anpassen:
    P:\Scripts\PS2EXE\verpatch\verpatch.exe "P:\Scripts\PS2EXE\sample.exe" /pv 1.0.0.0
  2. Produktnamen anpassen:
    P:\Scripts\PS2EXE\verpatch\verpatch.exe "P:\Scripts\PS2EXE\sample.exe" /s product "Andi's iT Blog Sample"
  3. Beschreibung anpassen:
    P:\Scripts\PS2EXE\verpatch\verpatch.exe "P:\Scripts\PS2EXE\sample.exe" /s desc "Andi's iT Blog Sample"
  4. Dateiversion anpassen:
    P:\Scripts\PS2EXE\verpatch\verpatch.exe "P:\Scripts\PS2EXE\sample.exe" 1.0.0.0
  5. Copyright anpassen:
    P:\Scripts\PS2EXE\verpatch\verpatch.exe "P:\Scripts\PS2EXE\sample.exe" /s (c) "Andi's iT Blog"

Damit schaut das ganze wie folgt aus:

Bild 6 - EXE Details bearbeitet

EXE mit ICON File erstellen – Optional Schritt 3

Wer jetzt noch gern ein ICON an seiner neuen EXE-Datei hätte muss eine Kleinigkeit beachten. Bei mir musste die ICO-Datei zusätzlich im Homedrive liegen, das bekommt man mit folgendem Befehl heraus:

echo %homedrive%

Hier liegt bei mir noch die ICO des Out of Office Tools. Nun verwende ich erneut den Befehl aus Schritt 1 leicht abgeändert:

P:\Scripts\PS2EXE\PS2EXE_0.5.0.0.0\ps2exe.ps1 -inputFile P:\Scripts\PS2EXE\sample.ps1 -outputFile P:\Scripts\PS2EXE\sample.exe -sta -noConsole -runtime40 -verbose -x64 -iconFile icon.ico
Hinweis: Die erweiterten EXE-Details werden natürlich wieder überschrieben ;)

Somit habe ich mein Fertiges PS1-Script in eine EXE umgewandelt …

PowerShell to EXE- Fertige EXE mit ICO und Details

Andi

 

(PS: Schon zur EUGO angemeldet? –> https://asichel.de/eugo