Electron Builder自定义NSIS安装卸载脚本问题及错误求助
解决Electron NSIS自定义安装/卸载的问题
一、Python自动安装失败(文件找不到+缺失检查逻辑)
1. 修复文件找不到错误
你的{$SOURCEPATH}变量未正确指向Python安装包路径,或文件路径写法有误,按以下步骤修正:
- 确认
python-3.11.0.exe存放位置,比如放在项目根目录的resources文件夹下。 - 修改NSIS宏的
File命令,使用相对路径或正确变量:!macro customInstall ; 引入Python安装包到临时目录 File "resources\python-3.11.0.exe" ; 执行静默安装 ExecWait '$PLUGINSDIR\python-3.11.0.exe /quiet InstallAllUsers=1 PrependPath=1' ; 安装完成后清理临时文件 Delete '$PLUGINSDIR\python-3.11.0.exe' !macroend - 若用electron-builder,需在
package.json的build配置中添加资源声明,确保打包时包含安装包:
此时NSIS宏可改为"build": { "nsis": { // 你的NSIS其他配置 }, "extraResources": [ { "from": "resources/python-3.11.0.exe", "to": "python-3.11.0.exe" } ] }File "${extraResourcesDir}\python-3.11.0.exe"引用安装包。
2. 添加Python已安装检查逻辑
在执行安装前,先检查系统是否已安装Python:
!macro customInstall ; 检查Python是否存在 ClearErrors ExecWait 'python -V' $0 ; 返回值不为0则执行安装流程 IfErrors 0 +4 File "resources\python-3.11.0.exe" ExecWait '$PLUGINSDIR\python-3.11.0.exe /quiet InstallAllUsers=1 PrependPath=1' Delete '$PLUGINSDIR\python-3.11.0.exe' !macroend
二、卸载阶段问题修复
1. 无法删除C:\Windows\BSD文件夹
del命令仅能删除文件,删除文件夹需使用RMDir命令,搭配/r(递归子目录)和/s(删除文件)参数:
!macro customUnInstall ; 删除计划任务 ExecWait "schtasks /Delete /TN BSD-TASK /F" ; 递归删除整个目标文件夹 RMDir /r /s "C:\Windows\BSD" !macroend
2. 确保schtasks以管理员权限执行
在NSIS脚本开头添加权限声明,保证卸载程序以管理员身份运行:
RequestExecutionLevel admin
此配置会让卸载流程自动获取管理员权限,确保schtasks命令顺利执行。
完整修正后的NSIS宏示例
RequestExecutionLevel admin !macro preInit SetRegView 64 WriteRegExpandStr HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation "C:\Windows\BSD" WriteRegExpandStr HKCU "${INSTALL_REGISTRY_KEY}" InstallLocation "C:\Windows\BSD" SetRegView 32 WriteRegExpandStr HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation "C:\Windows\BSD" WriteRegExpandStr HKCU "${INSTALL_REGISTRY_KEY}" InstallLocation "C:\Windows\BSD" !macroend !macro customInstall ; 检查Python是否已安装 ClearErrors ExecWait 'python -V' $0 IfErrors 0 +4 File "resources\python-3.11.0.exe" ExecWait '$PLUGINSDIR\python-3.11.0.exe /quiet InstallAllUsers=1 PrependPath=1' Delete '$PLUGINSDIR\python-3.11.0.exe' !macroend !macro customUnInstall ExecWait "schtasks /Delete /TN BSD-TASK /F" RMDir /r /s "C:\Windows\BSD" !macroend
内容的提问来源于stack exchange,提问作者OnTheRoad
相关产品推荐
相关产品推荐

