PowerShell : convertir PS1 en EXE (exécutable)
I. Présentation
Il peut s'avérer utile de compiler un script PowerShell en exécutable afin d'en faire un véritable programme, capable de s'exécuter en autonomie sans passer par la console PowerShell. Cela est d'autant plus vrai lorsque l'on souhaite créer une application en PowerShell, basée sur WPF par exemple.
Dans ce tutoriel, nous allons voir comment convertir un fichier PS1 en EXE, à l'aide d'un outil gratuit nommé "Ps1 To Exe".
Avant de continuer, téléchargez le logiciel : PS1 To Exe
II. PS1 To Exe
Une fois l'installeur téléchargé, installez le logiciel qui s'avère assez léger. Il va falloir ouvrir dans le logiciel le script PowerShell que vous souhaitez convertir.
Pour cela, cliquez sur le bouton "Open" et ouvrez votre fichier PS1.
À partir de ce moment-là, nous pourrions lancer directement la conversion, mais je vais vous montrer quelques options. Sur la droite, dans l'onglet "Options", vous avez l'option "Icon". Cela permet de définir un icône pour votre application, lorsque celle-ci sera visible dans l'explorateur Windows. Il ne s'agit pas de l'icône au sein de l'application, mais bien celui visible dans l'explorateur de fichiers.
Vous avez la possibilité de choisir le format de votre exécutable, à savoir 32 ou 64 bits, ainsi qu'état de la console PowerShell. Si vous souhaitez que la console PowerShell ne s'affiche pas, afin de voir uniquement votre interface graphique, sélectionnez une option avec "Windows (Invisible)".
Enfin, si vous utilisez un fichier de configuration ou tout autre fichier que vous souhaitez intégrer à l'exécutable, c'est possible ! Cliquez sur l'onglet "Embed" et cliquez sur "Add" afin de rechercher le fichier à intégrer dans l'exécutable. Il est possible d'intégrer plusieurs fichiers, mais cela impactera forcément la taille de votre exécutable.
Le bouton "Convert" va permettre de démarrer la conversion afin d'obtenir votre script au format Exe. Lorsque vous cliquez sur le bouton, vous devez indiquer le chemin où vous voulez l'enregistrer, ainsi que son nom.
Voilà, il ne reste plus qu'à utiliser votre programme ! 😉👏
marche pas et de plus l’exécutable créé est sniffé par malwareBytes, le mieux est encore un bon .bat
Bonjour Eric, ça ne marche pas, c’est-à-dire ?
Même problème, l’exe généré est supprimé par Windows Defender.
Bonsoir,
C’est étonnant, je viens de l’installer sur un autre PC, avec la dernière version d’ESET, aucun problème que ce soit au niveau de « PS1 to Exe » ou du script compilé en EXE. Sur mon PC avec Windows Defender, je n’ai pas rencontré de problème non plus. Avez-vous coché des options spécifiques ?
Florian
Comment est-ce qu’on appel/utilise les fichiers inclus (embed) à partir du script powershell ?
Bonjour, il faut s’appuyer sur « $env:p2eincfilepath » suivi du nom du fichier.
Super un grand merci
Bonjour. Merci pour ce logiciel. Petit souci, quand je sélectionne l’option « Windows (Invisible) », le message d’erreur « Couldn’t add resources » apparaît. Par contre, avec l’option « Console (Visible) », ça fonctionne. Seb
J’ai oublié de préciser que le message d’erreur apparaît au moment de la conversion en .EXE
Cette application n’est vraiment pas recommandable pour faire ce genre de chose, plusieurs antivirus d’entreprise l’envoie balader, je ne peux vous conseiller cette outil, il est possible d’utiliser le PowerShell avec un compilateur de package voir le travail de Damien Van Robaeys (http://www.systanddeploy.com/2017/11/ps1-to-exe-generator-new-version.html).
Pour la partie variable, je vous invite à utiliser ce petit bout de code qui vous permettra d’utiliser la racine de votre script à coup-sûr.
#=============== Variable for use Root folder of PS1 ====================
If ($psISE)
{
$currentScriptDirectory = Split-Path -Parent -Path $psISE.CurrentFile.FullPath
}
If (!$currentScriptDirectory)
{
If ($MyInvocation.MyCommand.CommandType -eq "ExternalScript")
{
$currentScriptDirectory = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition
}
Else
{
$currentScriptDirectory = Split-Path -Parent -Path ([Environment]::GetCommandLineArgs()[0])
}
}
#========================================================================
Il existe une exception sera uniquement lorsque vous utiliserez PS2EXE de Ingo Karstein, il faudra utiliser ceci :
$FullPathToEXE = [System.Diagnostics.Process]::GetCurrentProcess().MainModule.FileName
$currentScriptDirectory = [System.IO.Path]::GetDirectoryName($FullPathToEXE)
#le chemin racine sera la variable $CurrentScriptPath
Bien à vous