Überarbeitung des tollen Drehbuchs von Ingo Karstein mit GUI-Unterstützung. Die GUI-Ausgabe und -Eingabe wird mit einem Schalter aktiviert, es werden echte Windows-Ausführungsdateien generiert. Kompiliert nur mit und nach Powershell 5.x. Mit optionalem grafischem Frontend Win-PS2EXE.
Modulversion.
Die skriptbasierte Version finden Sie hier (https://github.com/MScholtes/TechNet-Gallery).
Autor: Markus Scholtes
Version: 1.0.14
Datum: 15.09.2024
PS C: > Install-Module ps2exe
oder hier herunterladen: https://www.powershellgallery.com/packages/ps2exe/.
Invoke-ps2exe .source.ps1 . target.exe
oder
ps2exe .source.ps1 . target.exe
kompiliert „source.ps1“ in die ausführbare Datei target.exe (wenn „.target.exe“ weggelassen wird, wird die Ausgabe nach „.source.exe“ geschrieben).
oder starten Sie Win-PS2EXE für ein grafisches Frontend mit
Win - PS2EXE
ps2exe [ - inputFile ] ' ' [[ - outputFile ] ' ' ]
[ - prepareDebug ] [ - x86 | - x64 ] [ - lcid < id > ] [ - STA | - MTA ] [ - noConsole ] [ - UNICODEEncoding ]
[ - credentialGUI ] [ - iconFile ' ' ] [ - title ' ' ] [ - description ' ' ]
[ - company ' ' ] [ - product ' ' ] [ - copyright ' ' ] [ - trademark ' ' ]
[ - version ' ' ] [ - configFile ] [ - noOutput ] [ - noError ] [ - noVisualStyles ] [ - exitOnCancel ]
[ - DPIAware ] [ - requireAdmin ] [ - supportOS ] [ - virtualize ] [ - longPaths ]
inputFile = Powershell script that you want to convert to executable (file has to be UTF8 or UTF16 encoded)
outputFile = destination executable file name or folder, defaults to inputFile with extension '.exe'
prepareDebug = create helpful information for debugging
x86 or x64 = compile for 32-bit or 64-bit runtime only
lcid = location ID for the compiled executable. Current user culture if not specified
STA or MTA = 'Single Thread Apartment' or 'Multi Thread Apartment' mode
noConsole = the resulting executable will be a Windows Forms app without a console window
UNICODEEncoding = encode output as UNICODE in console mode
credentialGUI = use GUI for prompting credentials in console mode
iconFile = icon file name for the compiled executable
title = title information (displayed in details tab of Windows Explorer's properties dialog)
description = description information (not displayed, but embedded in executable)
company = company information (not displayed, but embedded in executable)
product = product information (displayed in details tab of Windows Explorer's properties dialog)
copyright = copyright information (displayed in details tab of Windows Explorer's properties dialog)
trademark = trademark information (displayed in details tab of Windows Explorer's properties dialog)
version = version information (displayed in details tab of Windows Explorer's properties dialog)
configFile = write config file (.exe.config)
noOutput = the resulting executable will generate no standard output (includes verbose and information channel)
noError = the resulting executable will generate no error output (includes warning and debug channel)
noVisualStyles = disable visual styles for a generated windows GUI application (only with -noConsole)
exitOnCancel = exits program when Cancel or "X" is selected in a Read-Host input box (only with -noConsole)
DPIAware = if display scaling is activated, GUI controls will be scaled if possible (only with -noConsole)
requireAdmin = if UAC is enabled, compiled executable run only in elevated context (UAC dialog appears if required)
supportOS = use functions of newest Windows versions (execute [Environment]::OSVersion to see the difference)
virtualize = application virtualization is activated (forcing x86 runtime)
longPaths = enable long paths ( > 260 characters) if enabled on OS (works only with Windows 10)
Eine generierte ausführbare Datei verfügt über die folgenden reservierten Parameter:
-? [] Powershell help text of the script inside the executable. The optional parameter combination
"-? -detailed", "-? -examples" or "-? -full" can be used to get the appropriate help text.
-debug Forces the executable to be debugged. It calls "System.Diagnostics.Debugger.Launch()".
-extract: Extracts the powerShell script inside the executable and saves it as FILENAME.
The script will not be executed.
-wait At the end of the script execution it writes "Hit any key to exit..." and waits for a key to be pressed.
-end All following options will be passed to the script inside the executable.
All preceding options are used by the executable itself and will not be passed to the script.
Die grundlegenden Ein-/Ausgabebefehle mussten für PS2EXE in C# neu geschrieben werden. Nicht implementiert sind Write-Progress im Konsolenmodus (zu viel Arbeit) und Start-Transcript / Stop-Transcript (keine ordnungsgemäße Referenzimplementierung durch Microsoft).
Standardmäßig werden in Powershell-Ausgaben von Commandlets Zeile für Zeile formatiert (als Array von Zeichenfolgen). Wenn Ihr Befehl 10 Ausgabezeilen generiert und Sie die GUI-Ausgabe verwenden, werden jeweils 10 Meldungsfelder angezeigt, die auf ein OK warten. Um dies zu verhindern, leiten Sie Ihren Befehl an den Comandlet Out-String weiter. Dadurch wird die Ausgabe in ein String-Array mit 10 Zeilen konvertiert. Die gesamte Ausgabe wird in einem Meldungsfeld angezeigt (z. B. dir C: | Out-String).
PS2EXE kann Konfigurationsdateien mit dem Namen der generierten ausführbaren Datei + „.config“ erstellen. In den meisten Fällen sind diese Konfigurationsdateien nicht erforderlich, sondern ein Manifest, das angibt, welche .Net Framework-Version verwendet werden soll. Da Sie normalerweise das eigentliche .Net Framework verwenden, versuchen Sie, Ihre ausführbare Datei ohne die Konfigurationsdatei auszuführen.
Kompilierte Skripte verarbeiten Parameter wie das Originalskript. Eine Einschränkung ergibt sich aus der Windows-Umgebung: Für alle ausführbaren Dateien haben alle Parameter den Typ STRING. Wenn es keine implizite Konvertierung für Ihren Parametertyp gibt, müssen Sie die Konvertierung explizit in Ihrem Skript durchführen. Sie können mit derselben Einschränkung sogar Inhalte an die ausführbare Datei weiterleiten (alle weitergeleiteten Werte haben den Typ STRING).
Speichern Sie niemals Passwörter in Ihrem kompilierten Skript! Man kann das Skript einfach mit dem Parameter -extract dekompilieren. Zum Beispiel
Output.exe - extract:C:Output.ps1
dekompiliert das in Output.exe gespeicherte Skript.
Da PS2EXE ein Skript in eine ausführbare Datei konvertiert, sind skriptbezogene Variablen nicht mehr verfügbar. Insbesondere die Variable $PSScriptRoot ist leer.
Die Variable $MyInvocation wird auf andere Werte als in einem Skript gesetzt.
Sie können den Skript-/ausführbaren Pfad unabhängig von kompiliert/nicht kompiliert mit dem folgenden Code abrufen (danke an JacquesFS):
if ( $MyInvocation .MyCommand.CommandType -eq " ExternalScript " )
{ $ScriptPath = Split-Path - Parent - Path $MyInvocation .MyCommand.Definition }
else
{ $ScriptPath = Split-Path - Parent - Path ([ Environment ]::GetCommandLineArgs()[ 0 ])
if ( ! $ScriptPath ){ $ScriptPath = " . " } }
Wenn ein externes Fenster in einem Skript mit dem -noConsole-Modus geöffnet wird (z. B. für Get-Credential oder für einen Befehl, der eine cmd.exe-Shell benötigt), wird das nächste Fenster im Hintergrund geöffnet.
Der Grund dafür ist, dass Windows beim Schließen des externen Fensters versucht, das übergeordnete Fenster zu aktivieren. Da das kompilierte Skript kein Fenster hat, wird stattdessen das übergeordnete Fenster des kompilierten Skripts aktiviert, normalerweise das Fenster von Explorer oder Powershell.
Um dies zu umgehen, öffnet $Host.UI.RawUI.FlushInputBuffer() ein unsichtbares Fenster, das aktiviert werden kann. Der folgende Aufruf von $Host.UI.RawUI.FlushInputBuffer() schließt dieses Fenster (und so weiter).
Das folgende Beispiel öffnet kein Fenster mehr im Hintergrund, wie es ein einzelner Aufruf von „ipconfig | Out-String“ tun würde:
$Host .UI.RawUI.FlushInputBuffer ()
ipconfig | Out-String
$Host .UI.RawUI.FlushInputBuffer ()
Konvertierte Dateien von UTF-16 nach UTF-8, um Git Diff zu ermöglichen
Ignorieren Sie Steuerschlüssel in der Anforderung einer sicheren Zeichenfolge im Konsolenmodus