如何在NSIS中调用PowerShell

时间:2012-11-15 03:56:46

标签: powershell nsis windows-server-2008-r2

我正在尝试在NSIS中运行PowerShell。当我运行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却被挂了。

我已经搜索了这个问题,并找到了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

2 个答案:

答案 0 :(得分:2)

自从我使用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

答案 1 :(得分:2)

据我所知,AaronLS的回答对我不起作用,我找到了两个解决这个问题的方法,与PowerShell v2 reported here中的一个错误有关(但从未修复过):

  • Upgrade to 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"  '
    

使用宏I've written here,只需${PowerShellExec} "echo 'hello powershell'"