NSIS 打包小技巧
需要添加的头部代码
; 该脚本使用 HM VNISEdit 脚本编辑器向导产生
Unicode True ;清除警告:7998: ANSI targets are deprecated
!define PRODUCT_NAME "xxxxx"
; ------ MUI 现代界面定义 (1.67 版本以上兼容) ------
!include "MUI.nsh"
!include "WordFunc.nsh"
!include "FileFunc.nsh"
;----------自定义部分~~~~
!define DotNet6 "dotnet-sdk-6.0.402-win-x86.exe"
!define Net6Ver "6.0.402"
!define exeName "xxxxx.exe"
var Version
安装时判断程序是否在运行
不只是为啥,FindProcDLL这个库不起作用了,换了一个可以了!
Function .onInit
;关闭进程
CheckProc:
nsProcess::_FindProcess ${exeName}
Pop $R0
MessageBox MB_OK "进程检测(${exeName} ($R0))"
${If} $R0 == 0 # Success
Goto CloseExe
${Else}
Goto Done
${EndIf}
CloseExe:
MessageBox MB_OKCANCEL|MB_ICONSTOP "安装程序检测到 ${PRODUCT_NAME} 正在运行。$\r$\n$\r$\n点击 “确定” 强制关闭${PRODUCT_NAME},继续安装。$\r$\n点击 “取消” 退出安装程序。" IDCANCEL Exit
nsProcess::_KillProcess ${exeName}
Sleep 1000
Goto CheckProc
Exit:
Abort
Done:
FunctionEnd
卸载时判断程序是否在运行
Function un.onInit
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "您确实要完全移除 $(^Name) ,及其所有的组件?" IDYES +2
Abort
;进程检测
nsProcess::_FindProcess ${exeName}
Pop $R0
${If} $R0 == 0 # Success
Goto UN_CloseExe
${Else}
Goto UN_Done
${EndIf}
UN_CloseExe:
MessageBox MB_ICONSTOP "卸载程序检测到 ${PRODUCT_NAME} 正在运行,请关闭之后再卸载!"
Quit
UN_Done:
FunctionEnd
检测.NET 6环境是否安装,没有则安装
Section -.NET
# 命令执行结果存于栈中
nsExec::ExecToStack 'cmd /c "dotnet --list-sdks"'
# 命令行执行成功与否
Pop $0
${If} $0 == 0
MessageBox MB_OK "执行成功($0)"
${Else}
MessageBox MB_OK "执行失败($0)" IDYES gogogo
${EndIf}
# 执行成功获取返回值!
Pop $0
# 截取前面的7位是版本号
StrCpy $Version $0 7
MessageBox MB_YESNO $Version
# 比较版本号的大小
${VersionCompare} ${Net6Ver} "$Version" $R2
${If} $R2 == 0
MessageBox MB_OK "版本相同($Version)"
${ElseIf} $R2 == 1
# MessageBox MB_OK "已安装版本低($Version)"
${ElseIf} $R2 == 2
MessageBox MB_OK "已安装更高版本($Version)"
${EndIf}
${If} $R2 == 1
gogogo:
SetDetailsPrint textonly
DetailPrint "正在安装 .NET 6.0"
SetDetailsPrint listonly
SetOutPath "$TEMP"
# MessageBox MB_YESNO "$TEMP"
SetOverwrite on
File ${DotNet6}
# /passive无人参与模式 - 只显示进度栏, /norestart 安装完成后不重新启动
ExecWait '"$TEMP\${DotNet6}" /passive /norestart '
Delete "$TEMP\${DotNet6}"
${EndIf}
SectionEnd
固定安装目录
有时候,为了方便管理,想固定安装目录,注释掉目录选择界面即可!
; 安装目录选择页面(注释掉了,这样就安装目录就不可选择了!)
;!insertmacro MUI_PAGE_DIRECTORY
完成页面小技巧
NSIS有预定义的完成界面,界面上面可以加一些 !define 来修饰这些界面,
比如安装完成,后立即运行程序
; 安装完成页面
!define MUI_FINISHPAGE_RUN "$INSTDIR\xxxxx.exe"
!insertmacro MUI_PAGE_FINISH
此时这里机会多一个运行的选择框,如果此时点击完成,程序就会自动运行起来~~
其实,还有很多选项可以加,比如重启等等:
作者:宋桓公
出处:http://www.cnblogs.com/douzi2/
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~