Surmenage du superbe script d'Ingo Karstein avec support GUI. La sortie et l'entrée de l'interface graphique sont activées avec un seul commutateur, de vrais exécutables Windows sont générés. Compile uniquement avec et vers Powershell 5.x. Avec frontal graphique en option Win-PS2EXE.
Version modulaire.
Vous trouvez la version basée sur un script ici (https://github.com/MScholtes/TechNet-Gallery).
Auteur : Markus Scholtes
Version : 1.0.14
Dates : 2024-09-15
PS C: > Install-Module ps2exe
ou téléchargez-le ici : https://www.powershellgallery.com/packages/ps2exe/.
Invoke-ps2exe .source.ps1 . target.exe
ou
ps2exe .source.ps1 . target.exe
compile "source.ps1" dans l'exécutable target.exe (si ".target.exe" est omis, la sortie est écrite dans ".source.exe").
ou démarrez Win-PS2EXE pour un frontal graphique avec
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)
Un exécutable généré possède les paramètres réservés suivants :
-? [] 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.
Les commandes d'entrée/sortie de base ont dû être réécrites en C# pour PS2EXE. Ne sont pas implémentés Write-Progress en mode console (trop de travail) et Start-Transcript / Stop-Transcript (pas d'implémentation de référence appropriée par Microsoft).
Par défaut, dans PowerShell, les sorties des commandlets sont formatées ligne par ligne (sous forme de tableau de chaînes). Lorsque votre commande génère 10 lignes de sortie et que vous utilisez la sortie GUI, 10 boîtes de message apparaîtront chacune en attente d'un OK. Pour éviter cela, dirigez votre commande vers la commande Out-String. Cela convertira la sortie en un tableau de chaînes de 10 lignes, toutes les sorties seront affichées dans une boîte de message (par exemple : dir C: | Out-String).
PS2EXE peut créer des fichiers de configuration avec le nom de l'exécutable généré + ".config". Dans la plupart des cas, ces fichiers de configuration ne sont pas nécessaires, il s'agit d'un manifeste indiquant quelle version de .Net Framework doit être utilisée. Comme vous utiliserez généralement le .Net Framework actuel, essayez d'exécuter votre exécutable sans le fichier de configuration.
Les scripts compilés traitent les paramètres comme le fait le script original. Une restriction vient de l'environnement Windows : pour tous les exécutables tous les paramètres ont le type STRING, s'il n'y a pas de conversion implicite pour votre type de paramètre vous devez convertir explicitement dans votre script. Vous pouvez même rediriger le contenu vers l'exécutable avec la même restriction (toutes les valeurs redirigées ont le type STRING).
Ne stockez jamais de mots de passe dans votre script compilé ! On peut simplement décompiler le script avec le paramètre -extract. Par exemple
Output.exe - extract:C:Output.ps1
décompilera le script stocké dans Output.exe.
Puisque PS2EXE convertit un script en exécutable, les variables liées au script ne sont plus disponibles. Surtout la variable $PSScriptRoot est vide.
La variable $MyInvocation est définie sur d'autres valeurs que dans un script.
Vous pouvez récupérer le chemin script/exécutable indépendamment de compilé/non compilé avec le code suivant (grâce à 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 = " . " } }
Lorsqu'une fenêtre externe est ouverte dans un script en mode -noConsole (c'est-à-dire pour Get-Credential ou pour une commande nécessitant un shell cmd.exe), la fenêtre suivante est ouverte en arrière-plan.
La raison en est qu'à la fermeture de la fenêtre externe, Windows tente d'activer la fenêtre parent. Puisque le script compilé n'a pas de fenêtre, la fenêtre parent du script compilé est activée à la place, normalement la fenêtre de l'Explorateur ou de Powershell.
Pour contourner ce problème, $Host.UI.RawUI.FlushInputBuffer() ouvre une fenêtre invisible qui peut être activée. L'appel suivant de $Host.UI.RawUI.FlushInputBuffer() ferme cette fenêtre (et ainsi de suite).
L'exemple suivant n'ouvrira plus de fenêtre en arrière-plan comme le ferait un simple appel de "ipconfig | Out-String" :
$Host .UI.RawUI.FlushInputBuffer ()
ipconfig | Out-String
$Host .UI.RawUI.FlushInputBuffer ()
fichiers convertis d'UTF-16 en UTF-8 pour permettre git diff
ignorer les clés de contrôle dans la demande de chaîne sécurisée en mode console