You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

electron-builder NSIS自定义宏在打包时执行而非安装时求助

解决electron-builder中NSIS自定义脚本在打包时执行而非安装时执行的问题

我明白你遇到的问题了——你在installer.nsh里定义的NSIS宏中使用了!system命令,但这些命令居然在electron-builder打包生成安装包的阶段就执行了,而不是用户运行安装程序的时候才触发。这其实是因为你用错了NSIS的命令类型。

问题根源

!system是NSIS的预处理器指令,它的作用是在NSIS脚本编译(也就是electron-builder打包过程)时执行系统命令,而不是在安装程序运行时执行。如果你想让命令在用户安装/卸载过程中触发,需要使用NSIS的运行时执行命令,比如Exec或ExecWait。

解决方案

把宏里的!system替换成NSIS运行时命令,同时注意调整路径变量——打包时的${BUILD_RESOURCES_DIR}在安装阶段是不存在的,你需要改用NSIS安装时的变量(比如$INSTDIR表示用户选择的安装目录)。

下面是修改后的示例脚本:

!macro customHeader
# 注意:customHeader属于预处理器阶段的宏,仅在编译安装包时生效
# 如果需要安装时执行逻辑,请将代码移到preInit、customInit等运行时宏中
!macroend

!macro preInit
# preInit在安装程序初始化阶段触发,用ExecWait执行系统命令
ExecWait 'cmd.exe /c echo "preInit" > "$INSTDIR\preInit.log"'
!macroend

!macro customInit
ExecWait 'cmd.exe /c echo "customInit" > "$INSTDIR\customInit.log"'
!macroend

!macro customInstall
# customInstall在安装流程中触发,可执行安装相关的系统命令
ExecWait 'cmd.exe /c echo "customInstall" > "$INSTDIR\customInstall.log"'
!macroend

!macro customUnInstall
# 卸载流程触发,使用$INSTDIR定位安装目录
ExecWait 'cmd.exe /c echo "customUnInstall" > "$INSTDIR\customUnInstall.log"'
!macroend

关键说明

  1. Exec vs ExecWait:Exec会异步执行命令,安装程序会继续往下走;ExecWait会等待命令执行完成后再继续,适合需要确保命令执行完毕的场景。
  2. 路径变量:安装时使用$INSTDIR(用户选择的安装目录)、$TEMP(系统临时目录)等NSIS内置的运行时变量,不要用打包阶段的${BUILD_RESOURCES_DIR}。
  3. 调用系统命令:NSIS本身没有echo这类命令,需要通过cmd.exe /c来调用Windows命令行执行。

这样修改后,你的自定义命令就会在用户运行安装/卸载程序时触发,而不是在electron-builder打包阶段执行了。

内容的提问来源于stack exchange,提问作者Kid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 07:42:42