我正在尝试在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
答案 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中的一个错误有关(但从未修复过):
从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'"
。