首页 > 其他分享 >NSIS 常用的代码

NSIS 常用的代码

时间:2023-03-17 18:11:54浏览次数:44  
标签:MessageBox OK MB 代码 常用 NSIS Version 安装 define

实现递归拷贝

默认生成的脚本,没有递归拷贝,我们需要手动加上  /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博客

 

标签:MessageBox,OK,MB,代码,常用,NSIS,Version,安装,define
From: https://www.cnblogs.com/youyaoqi/p/17227755.html

相关文章

  • C代码审计之缓冲区溢出漏洞及修复方案
    当在某特定数据结构的内存空间的边界之外写入数据时,即会发生缓冲区溢出。 本篇主要针对字符串操作错误引发的漏洞。1、无界字符串复制发生于从源数据复制数据到一个定......
  • Git 常用命令说明
    安装GitWindows安装包下载地址:https://git-scm.com/download/win安装时,基本按默认选项,但:在SelectComponents页,勾选WindowsExplorerintegration->Sim......
  • golang代码覆盖率测试
    1.概述测试是开发过程的重要部分,也是软件开发生命周期的关键部分。它可以确保应用程序正常运行和满足客户需求。本文将涵盖关于Go测试的所有须知事项。我们将从一个......
  • 虽然代码运行了,但其中的值为什么没有发生变化呀?
    大家好,我是皮皮。一、前言前几天在Python白银交流群【王者级混子】问了一个Pandas处理的问题,这里拿出来给大家分享下。下面是粉丝自己写的代码:二、实现过程看上去是......
  • 优维低代码:构件编辑器开发
    优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维......
  • 5、常用类
    常用类,主讲:汤小洋一、API的使用1.简介1.1什么是APIApplicationProgrammingInterface应用程序编程接口,实际上就是帮助手册JDKAPI:提供了JDK中大部分类以及类中......
  • 如何用低代码平台快速搭建一套应用系统
    一、低代码是什么低代码平台是继中台之后又一个火爆的话题,实际上低代码本身并不是一个新颖的话题,也不是最近才有的技术突破和创新,而是存在了十几二十年的概念。早期的大型......
  • Vue 常用语句
    删除对象数组中的一个对象tableData.value.splice(tableData.value.findIndex((m)=>m.id==row.id),1)批量删除rows.forEach((ro......
  • 代码去重引发对lamba表达式思考
    对重复代码进行治理,发现很多冗余代码就因为其中的一行无法复用,就拷贝一份,造成大量重复代码,且后期维护成本很高,很容易改漏了 1、使用函数指针进行代码去重如下代码相似......
  • 前端有边界,但低代码没有
    “前端已死”的论调,每隔一段时间就会被翻出来重新讨论,除了先前人们担忧的低代码对前端开发者的影响,还有最近爆火的chatGPT、GPT-4等。作为前端开发者,我非常不认可“前端已......