web-dev-qa-db-fra.com

Vous créez un fichier exécutable .exe à partir d'un script PowerShell?

Est-il possible de créer un exécutable file.exe fichier à partir d'un script PowerShell?

31
LaPhi

Au moins, pas encore, et après 5 versions de PowerShell, cela semble peu probable.

J'aimerais pouvoir en rester là, mais d'autres personnes ont fourni un tas de réponses de type "contournement" que je me sens obligé de répondre:

Vous pouvez envelopper votre script .ps1 dans un autre type de script pour le rendre double-cliquable, et vous pouvez même générer un exécutable avec le script incorporé (voir le autres réponses sur ce sujet) ... mais ces "exécutables" nécessitent la bonne version de PowerShell pour être déjà présente sur le système, donc vous êtes ne gagne rien en faisant cela, et vous perdez beaucoup de fonctionnalités de PowerShell (comme la sortie d'objets en streaming, la documentation d'aide et la gestion automatique des paramètres avec complétion des onglets pour les utilisateurs).

Voici un simple wrapper de fichier batch .cmd (vous pouvez l'étendre pour autoriser les paramètres):

REM <#
copy %0 %0.ps1
PowerShell.exe -ExecutionPolicy Unrestricted -NoProfile -Command "&{Set-Alias REM Write-Host; .\%0.ps1}"
del %0.ps1
exit
REM #>

### Your PowerShell script goes below here.
### I've put a couple of lines as an example ...
ls | sort length -desc | select -first 5 | ft
ps | sort ws -desc | select -first 10 | ft

Je sais ...

Avec Portable PowerShell, il serait probablement possible de créer une sorte de Zip auto-extractible qui contiendrait la bonne version de PowerShell et un script et fonctionnerait. C'est pas un exécutable dans n'importe quel sens normal du mot - c'est un peu comme si Valve avait décidé de simplement envoyer une image vmware sur une clé USB comme solution pour permettre aux utilisateurs de Linux de jouer à Half Life. Cependant, le produit semble abandonné.

Avec PrimalScript (ou PowerShell Studio) ou PowerGui ou pShellExec, votre script peut être chiffré, il est donc légèrement sécurisé contre les regards indiscrets ... mais ce n'est fondamentalement que de l'obscurcissement, et essentiellement pas différent du fichier batch, et à certains égards pire.

19
Jaykul

Hors de la boîte - non. Cependant, j'ai construit un script PowerShell qui peut prendre un script et créer un wrapper EXE autour de lui. J'ai créé ce script il y a quelque temps mais j'ai décidé de le bloguer ici pour que les gens puissent le vérifier.

8
Keith Hill

Oui, il existe une option avec PS2EXE pour créer un tel *.exe Des dossiers.

Usage

Le tout est vraiment simple et bien expliqué néanmoins en voici un extrait:

C:\Scripts\PS2EXE\PS2EXE_0.5.0.0.0\ps2exe.ps1 
    -inputFile  C:\Scripts\ExampleEXE\example.ps1 
    -outputFile C:\Scripts\ExampleEXE\example.exe -sta -noConsole -runtime40 -verbose -x64

La seule mauvaise chose est que le projet est déprécié. Aucune mise à jour ou nouvelle version depuis 2015.

EDIT: Ce projet a été repris et est maintenu par une nouvelle personne maintenant. Vous pouvez trouver le code mis à jour ici, dernière mise à jour le 01/04/2018 à partir de cette modification. https://gallery.technet.Microsoft.com/scriptcenter/PS2EXE-GUI-Convert-e7cb69d5


Information sur la version

Pour ajouter et modifier les informations de version, utilisez quelque chose comme VERPATCH .


MISE À JOUR 2019

Criez à un git-repo qui s'appelle PythonEXE .

Il montre comment créer un exécutable à partir d'un projet Python et fournit également un guide étape par étape YouTube.

7
Smartis

Utilisez l'éditeur de script de PowerGUI (il est gratuit et fonctionne). Ouvrez votre script dans l'éditeur de script PowerGUI> Outils> Compiler le script> Choisissez les options que vous souhaitez pour votre .exe (mot de passe protégeant le code source, fermez automatiquement la console après l'exécution de .exe, etc.).

7
Jotunn

J'ai compris que votre question était "mon script PowerShell peut-il générer un exécutable?" C'est ce que j'essayais de faire quand j'ai trouvé ce post. Cela est possible à l'aide de la commande Add-Type.

Add-Type -TypeDefinition @"
    using System;
    class Program {
        public static void Main(string[] args) { 
            Console.WriteLine("Hello World!");
        }
    }
"@ -CompilerParameters @{
    "GenerateExecutable" = $true
    "OutputAssembly" = "test2.exe"
}
4
snydergd

PrimalScript from Sapien générera un exe à partir d'un script PowerShell. La machine sur laquelle l'exécutable est exécuté doit avoir PowerShell installé.

2
Chad Miller

La meilleure solution que j'ai trouvée pour distribuer un script PowerShell comme exe était de l'envelopper dans un exécutable NSIS .

J'écris un script .nsi comme celui-ci:

Name "Maintenance task"
OutFile "maintenance.exe"
ShowInstDetails show

Section "Main"
  ;Executes the "script-to-run.ps1" PowerShell script
  InitPluginsDir
  SetOutPath "$pluginsdir\MyOrg" ;It is better to put stuff in $pluginsdir, $temp is shared
  ;extract the .ps1 and run it, collecting output into details.
  File script-to-run.ps1
  nsExec::ExecToLog 'powershell  -inputformat none -ExecutionPolicy RemoteSigned -File "$pluginsdir\MyOrg\script-to-run.ps1"  '
  SetOutPath $exedir
SectionEnd

Je dois juste compiler le script en un exe avec la chaîne d'outils NSIS, et il fonctionnera sur n'importe quel système d'exploitation qui a PowerShell, quelle que soit la politique d'exécution.

Cela a été inspiré par cette question Comment appeler PowerShell dans NSIS .

2
CharlesB

Il y a un projet appelé Portable PowerShell qui est toujours en version bêta après quelques années ... pourrait valoir la peine d'être étudié pour vos besoins.

http://shelltools.wik.is/Portable_PowerShell

0
Trevor Sullivan