Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как вызвать PowerShell в NSIS

Автор вопроса: leo.zhangОтветов: 2

Я пытаюсь запустить PowerShell в NSIS. когда я запускаю сценарий NSIS:

!include "x64.nsh"

Name "nsExec Test"

OutFile "nsExecTest.exe"

ShowInstDetails show

Section "Output to variable"

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

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

Когда он выполнялся в "Import-Module ServerManager", PowerShell был запущен (это можно увидеть в процессах TaskManager). Но зависал nsExecTest.exe.

Я искал эту проблему в Google и нашел обходной путь для Java. https://blogs.oracle.com/vaibhav/entry/not_as_easy_as_we

У кого-нибудь есть идеи по этой проблеме в NSIS?

Обновлено: я упрощаю свой тестовый сценарий.

!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 $0 # return value/error/timeout
    Pop $1 # printed text, up to ${NSIS_MAX_STRLEN}
    DetailPrint '"ImportModules" printed: $1'
    DetailPrint " Return value: $0"
    DetailPrint ""

    ${EnableX64FSRedirection}
${Else}
${EndIf}
SectionEnd

powershellnsiswindows-server-2008-r2

Ответы

Ответ 1 · рейтинг 2 · CharlesB

Насколько я узнал, ответ AaronLS у меня не сработал, я нашел два обходных пути для этой проблемы, связанных с ошибкой в ​​PowerShell v2 сообщается здесь (но не исправлено):

  • Обновление до PowerShell v3
  • Запустите сценарий из файла в NSIS и укажите inputformat none. По очень странной причине вы должны оставить два пробела перед последней цитатой nsExec::ExecToStack:

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

Используя макросы, , которые я написал здесь, достаточно ${PowerShellExec} "echo 'hello powershell'".

Ответ 2 · рейтинг 2 · AaronLS

Прошло некоторое время с тех пор, как я использовал NSIS, поэтому я просто предполагаю, основываясь на синтаксисе, который я видел в другом месте:

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

Выньте вторую команду и просто протестируйте с первой и сначала запустите ее, тогда вы можете быть уверены, что первая команда у вас правильная.

Также попробуйте добавить < NUL в конец вашей и / или моей командной строки:

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

Я не уверен, нужно ли это заключать в двойные кавычки или нет. Он может зависнуть, если он ждет, пока вы завершите ввод данных, как если бы вы запускали его в интерактивном режиме:

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы