NSIS 常用的代码
实现递归拷贝
默认生成的脚本,没有递归拷贝,我们需要手动加上 /r 实现递归拷贝目录:
例子如下:
File /r "..\bin\Debug\net6.0-windows\*.*"
需要添加的头部代码
; 该脚本使用 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
此时这里机会多一个运行的选择框,如果此时点击完成,程序就会自动运行起来~~
其实,还有很多选项可以加,比如重启等等:
原文连接
(14条消息) NSIS 打包小技巧_nsis关闭进程_code bean的博客-CSDN博客