Comment appeler PowerShell dans les Ins

j'essaie de faire tourner PowerShell dans NSIS. quand j'exécute le script NSIS:

!include "x64.nsh"

Name "nsExec Test"

OutFile "nsExecTest.exe"

ShowInstDetails show

Section "Output to variable"

    nsExec::ExecToStack 'powershell -Command "& {Import-Module }" ServerManager'
    Pop "151900920" # return value/error/timeout
    Pop  # printed text, up to ${NSIS_MAX_STRLEN}
    DetailPrint '"ImportModules" printed: '
    DetailPrint "       Return value: "151900920""

    nsExec::ExecToStack 'powershell -Command "& {Get-WindowsFeature}" Desktop-Experience'
    Pop "151900920" # return value/error/timeout
    Pop  # printed text, up to ${NSIS_MAX_STRLEN}
    DetailPrint '"GetWindowsFeature" printed: '
    DetailPrint "       Return value: "151900920""
SectionEnd

quand il a exécuté à "importer-Module ServerManager", la PowerShell a été lancée(elle peut être vue dans les processus de TaskManager). Mais nsExecTest.exe a été suspendue au-dessus.

j'ai googlé ce problème, et j'ai trouvé une solution pour Java. https://blogs.oracle.com/vaibhav/entry/not_as_easy_as_we

N'importe qui a des idées pour ce problème dans les Ins?

mis à jour: Je simplifie mon script de test.

!include "x64.nsh"

Name "nsExec Test"
OutFile "nsExecTest.exe"
ShowInstDetails show

Section "Output to variable"
${If} ${RunningX64}
    ${DisableX64FSRedirection}

    nsExec::ExecToStack 'powershell.exe "& "Import-Module ServerManager"'
    Pop "151910920" # return value/error/timeout
    Pop  # printed text, up to ${NSIS_MAX_STRLEN}
    DetailPrint '"ImportModules" printed: '
    DetailPrint " Return value: "151910920""
    DetailPrint ""

    ${EnableX64FSRedirection}
${Else}
${EndIf}
SectionEnd
4
demandé sur leo.zhang 2012-11-15 07:56:46

2 réponses

pour autant que j'ai découvert, la réponse D'AaronLS ne fonctionnait pas pour moi, j'ai trouvé deux solutions pour ce problème, lié à un bug dans PowerShell v2 rapporté ici (mais jamais corrigé):

  • Mise à niveau de PowerShell v3
  • exécutez le script à partir d'un fichier dans NSIS, et spécifiez inputformat none . Pour une raison très étrange vous devez laisser deux espaces avant le dernière citation de nsExec::ExecToStack :

    SetOutPath "$pluginsdir\NSISTemp"
    File script.ps1
    nsExec::ExecToStack 'powershell -inputformat none -ExecutionPolicy RemoteSigned -File "$pluginsdir\NSISTemp\script.ps1"  '
    

à l'Aide des macros j'ai écrit ici , c'est juste une question de ${PowerShellExec} "echo 'hello powershell'" .

2
répondu CharlesB 2014-01-07 18:21:50

ça fait longtemps que j'ai utilisé les NSIS, donc je suppose que d'après la syntaxe que j'ai vu ailleurs:

nsExec::ExecToStack 'powershell.exe "& "Import-Module ServerManager"'

prenez la deuxième commande, et juste tester avec la première et obtenir que cela fonctionne d'abord, alors vous pouvez être sûr que vous avez la première commande droite.

essayez aussi d'ajouter < NUL à la fin de votre et / ou de ma ligne de commande:

nsExec::ExecToStack 'powershell -Command "& {Import-Module }" ServerManager < NUL'
nsExec::ExecToStack 'powershell.exe "& "Import-Module ServerManager" < NUL'

Je ne suis pas sûr si elle doit être à l'intérieur des guillemets ou pas. Il peut hang s'il attend que vous finissiez de fournir des entrées comme si vous l'exécutiez de manière interactive:

http://epeleg.blogspot.com/2010/06/solution-to-powershell-never-exists.html

2
répondu AaronLS 2012-11-15 04:08:33