4

我正在尝试在 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
4

2 回答 2

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

于 2012-11-15T04:02:45.877 回答
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'".

于 2014-01-06T16:01:34.063 回答