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

Я пытаюсь запустить 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

person leo.zhang    schedule 15.11.2012    source источник


Ответы (2)


Насколько я узнал, ответ 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'".

person CharlesB    schedule 06.01.2014
comment
Я отказываюсь от PowerShell и наконец использую servercmd (он заменен на PowerShell, но все еще может использоваться в Win2K8). - person leo.zhang; 09.01.2014

Прошло некоторое время с тех пор, как я использовал 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

person AaronLS    schedule 15.11.2012
comment
Спасибо за ответ, AaronLS. - person leo.zhang; 15.11.2012
comment
Я запускаю сценарий примерно так: nsExec::ExecToStack 'powershell.exe "& "Import-Module ServerManager"'. Выводит ошибки. Доступ к пути запрещен. Запускаю nsExec::ExecToStack 'powershell.exe "& "Import-Module ServerManager" < NUL', та же ошибка. Не могли бы вы дать мне совет по этому поводу? Спасибо. - person leo.zhang; 15.11.2012
comment
Вы также пробовали эту команду (ваша исходная команда с добавленным ‹NUL): nsExec::ExecToStack 'powershell -Command "& {Import-Module }" ServerManager < NUL' - person AaronLS; 16.11.2012
comment
Да, я также попробовал свою исходную команду с ‹NUL, и она вернула ошибку: Access to the path is denied. + CategoryInfo : NotSpecified: (:) [], UnauthorizedAccessException + FullyQualifiedErrorId : ConsoleHost.ReportException - person leo.zhang; 16.11.2012
comment
Единственное, что я могу предложить, - это сначала попытаться заставить команду PowerShell работать из командного файла. Возможно, это просто вопрос размещения котировок с ‹NUL. Вот еще один способ решения той же проблемы, но я не понимаю синтаксис в конце, но, возможно, это вам поможет: connect.microsoft.com/PowerShell/feedback/details/572313/ - person AaronLS; 16.11.2012
comment
Спасибо, AaronLS. Я этого не реализовал. В NSIS сложно использовать powershell. Но ваш ответ очень полезен. - person leo.zhang; 18.12.2012