2015-10-13 5 views
0

J'ai un script PowerShell que je veux exécuter silencieusement. J'utilise le script NSIS, il fait encore la promotion de l'invite de commande powershell lorsque le fichier .exe est exécuté ..Exécutez Powershell silencieusement via NSIS

Y at-il un moyen de le faire en silence.

!include FileFunc.nsh 
!include x64.nsh 


OutFile "script.exe" 
SilentInstall silent 
RequestExecutionLevel admin 

Function .onInit 
    SetSilent silent 
FunctionEnd 

Section 
    SetOutPath $EXEDIR 
    File "script.ps1" 
    IfSilent 0 +2 
     ExecWait "powershell -ExecutionPolicy Bypass .\script.ps1 -FFFeatureOff" 
SectionEnd 

Function .onInstSuccess 
    Delete "script.ps1" 
FunctionEnd 

Il y a un exemple ici qui utilise l'installation silencieuse, mais je ne pouvais pas le faire fonctionner quand je l'ai essayé. http://nsis.sourceforge.net/Examples/silent.nsi

+0

Pourquoi utilisez-vous IfSilent, « SilentInstall silencieuse » forcera à toujours se taire. – Anders

Répondre

2

Essayez ceci:

ExecWait "powershell -ExecutionPolicy Bypass -WindowStyle Hidden -File .\script.ps1 -FFFeatureOff" 

Plus d'info: PowerShell.exe Command-Line Help

+0

Cela affichera brièvement une fenêtre de console à l'écran, car la fenêtre de la console est créée avant que le processus powershell ne puisse la masquer. – Anders

+0

@Anders Yep, ma mauvaise, j'aurais dû vérifier moi-même. Merci pour la correction. – beatcracker

2

Powershell.exe est une application console et les applications console obtiennent une fenêtre de console par défaut et le paramètre silencieux NSIS n'a aucun impact sur les fenêtres de console créées pour les processus enfants. Un paramètre tel que -WindowStyle Hidden qui peut être transmis au processus enfant provoquera toujours une fenêtre de console pour être visible sur l'écran pendant une courte période, car Windows créera la fenêtre de console avant le démarrage du processus enfant.

Si vous devez masquer une fenêtre de console, vous devez utiliser un plugin. nsExec fait partie de l'installation par défaut ou vous pouvez utiliser un plugin tiers comme ExecDos qui offre des fonctionnalités plus avancées comme la gestion stdin.

Si vous n'avez pas besoin d'attendre que le processus de l'enfant, alors vous pouvez essayer ExecShell comme suggéré par Serge Z ...