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博客

 

posted @ 2023-03-17 18:02  、有妖气  阅读(177)  评论(0编辑  收藏  举报