在NSIS脚本中,调用外部程序的方法有ExecShell以及ExecWait:
ExecShell
使用 ShellExecute [译者注: Windows 的外壳关联] 执行指定的程序。注意: “动作” 通常为 “open”, “print” 等等,也可以是一个空字符串来使用默认动作。参数和显示类型是可选项。 $OUTDIR 用于指定工作路径。如果该命令不能被运行则会置一个错误标记。
动作 命令 [参数] [SW_SHOWNORMAL | SW_SHOWMAXIMIZED | SW_SHOWMINIMIZED | SW_HIDE]
ExecShell "open" "$INSTDIR\readme.txt"
ExecWait
执行一个指定的程序并且等待运行处理结束。更多信息请查看 Exec 。当程序执行返回一个非零错误代码或者当产生错误时,如果没有指定 “用户变量(返回代码)” 则 ExecWait 会放置一个错误标记。如果指定了 “用户变量(返回代码)” 则 ExecWait 会把变量设为返回代码(并且仅当产生错误时放置一个错误标记;如果产生错误则该用户变量的内容为未指定)。注意:如果该命令包含空格,你要用引号来把他们包括起来。例如: ExecWait ‘”$INSTDIR\command.exe” 参数’ 。如果你不用引号括起来则在 Windows 9x 下 不 正常或丢失参数。
命令 [用户变量(退出代码)]
ExecWait '"$INSTDIR\someprogram.exe"' $0
这两条命令的区别在于:
1、ExecWait会等待运行处理结束,更为稳妥;
2、ExecShell可以设置安装选项,更为灵活。如:
//这里我调用了外部的vc_redist.x64.exe程序,这是一个安装程序,加"/quiet"参数后实现了静默安装外部程序
ExecShell "" "$INSTDIR\vc_redist.x64.exe" "/quiet"
安装选项
</package | /i> <Product.msi>
安装或配置产品
/a <Product.msi>
管理安装 - 在网络上安装产品
/j<u|m> <Product.msi> [/t <Transform List>] [/g <Language ID>]
公布产品 - m 公布到所有用户,u 公布到当前用户
</uninstall | /x> <Product.msi | ProductCode>
卸载产品
显示选项
/quiet
安静模式,无用户交互
/passive
无人参与模式 - 只显示进度栏
/q[n|b|r|f]
设置用户界面级别
n - 无用户界面
b - 基本界面
r - 精简界面
f - 完整界面(默认值)
/help
帮助信息
重新启动选项
/norestart
安装完成后不重新启动
/promptrestart
必要时提示用户重新启动
/forcerestart
安装后始终重新启动计算机
日志选项
/l[i|w|e|a|r|u|c|m|o|p|v|x|+|!|*] <LogFile>
i - 状态消息
w - 非致命警告
e - 所有错误消息
a - 操作的启动
r - 操作特定记录
u - 用户请求
c - 初始用户界面参数
m - 内存不足或致命退出信息
o - 磁盘空间不足消息
p - 终端属性
v - 详细输出
x - 额外调试信息
+ - 扩展到现有日志文件
! - 每一行刷新到日志
* - 记录所有信息,除了 v 和 x 选项
/log <LogFile>
与 /l* <LogFile> 相同
更新选项
/update <Update1.msp>[;Update2.msp]
应用更新
/uninstall <PatchCodeGuid>[;Update2.msp] /package <Product.msi | ProductCode>
删除产品的更新
修复选项
/f[p|e|c|m|s|o|d|a|u|v] <Product.msi | ProductCode>
修复产品
p - 仅当文件丢失时
o - 如果文件丢失或安装了更旧的版本(默认值)
e - 如果文件丢失或安装了相同或更旧的版本
d - 如果文件丢失或安装了不同版本
c - 如果文件丢失或较验和与计算的值不匹配
a - 强制重新安装所有文件
u - 所有必要的用户特定注册表项(默认值)
m - 所有必要的计算机特定注册表项(默认值)
s - 所有现有的快捷键方式(默认值)
v - 从源运行并重新缓存本地安装包
设置公共属性
[PROPERTY=PropertyValue]
请查阅 Windows (R) Installer SDK 获得有关命令行语法的其他文档。
判断电脑的位数,操作实现很简单:
//这个记得一定得有,应该是定义了IF宏之类的,当我未加该条语句时,在IF处报错
!include "x64.nsh"
Section
${If} ${RunningX64}
//电脑为64为操作系统时,调用相应的外部安装程序
ExecShell "" "$INSTDIR\vc_redist.x64.exe" "/quiet"
${Else}
ExecShell "" "$INSTDIR\vc_redist.x86.exe" "/quiet"
${EndIf}
SectionEnd