通过 NSIS 静默运行 Powershell

Posted

技术标签:

【中文标题】通过 NSIS 静默运行 Powershell【英文标题】:Run Powershell Silently via NSIS 【发布时间】:2016-01-11 16:57:52 【问题描述】:

我有一个我想静默运行的 powershell 脚本。 我正在使用 NSIS 脚本,运行 .exe 文件时它仍在提升 powershell 命令提示符..

有没有办法让它静默。

!include FileFunc.nsh
!include x64.nsh


OutFile "script.exe"
SilentInstall silent
RequestExecutionLevel admin

Function .onInit
    SetSilent silent
FunctionEnd

Section
    SetOutPath $EXEDIR
    File "script.ps1"
    IfSilent 0 +2
        ExecWait "powershell -ExecutionPolicy Bypass .\script.ps1 -FFFeatureOff"
SectionEnd

Function .onInstSuccess
    Delete "script.ps1"
FunctionEnd

这里有一个使用静默安装的示例,但我尝试时无法正常工作。 http://nsis.sourceforge.net/Examples/silent.nsi

【问题讨论】:

你为什么要使用 IfSilent,“SilentInstall silent”会强制它一直保持沉默。 【参考方案1】:

试试这个:

ExecWait "powershell -ExecutionPolicy Bypass -WindowStyle Hidden -File .\script.ps1 -FFFeatureOff"

更多信息:PowerShell.exe Command-Line Help

【讨论】:

这将在屏幕上短暂显示一个控制台窗口,因为控制台窗口是在 powershell 进程能够隐藏它之前创建的。 @Anders 是的,我的错,我应该自己检查一下。谢谢指正。【参考方案2】:

您可以为此尝试 ExecShell,它允许通过 SW_HIDE 标志隐藏控制台:

ExpandEnvStrings $0 "%COMSPEC%"
ExecShell "" '"$0"' "/C powershell -ExecutionPolicy Bypass .\script.ps1 -FFFeatureOff" SW_HIDE

另外,参考这个问题: Exec vs ExecWait vs ExecShell vs nsExec::Exec vs nsExec::ExecToLog vs nsExec::ExecToStack vs ExecDos vs ExeCmd

【讨论】:

【参考方案3】:

Powershell.exe 是一个控制台应用程序,控制台应用程序默认获取一个控制台窗口,NSIS 静默参数对为子进程创建的控制台窗口没有影响。像-WindowStyle Hidden 这样可以传递给子进程的参数总是会导致控制台窗口在屏幕上显示一小段时间,因为Windows 会在子进程开始运行之前创建控制台窗口。

如果您需要隐藏控制台窗口,那么您应该使用插件。 nsExec 是默认安装的一部分,或者您可以使用像 ExecDos 这样的第三方插件,它提供更多高级功能,如标准输入处理。

如果您不需要等待子进程,那么您可以按照Serge Z 的建议尝试ExecShell...

【讨论】:

以上是关于通过 NSIS 静默运行 Powershell的主要内容,如果未能解决你的问题,请参考以下文章

如何静默自动更新通过 NSIS 为所有用户/每台机器安装的电子应用程序?

NSIS - 另一种为静默模式调用页面回调函数的方法

根据安装程序的 NSIS 卸载程序权限

NSIS 的卸载程序运行速度非常快

NSIS检测并卸载已有版本,静默卸载隐藏MessageBox

NSIS 构建不会在 Windows 上安装 Electron 应用程序。安装程序静默退出并产生 1620 错​​误