默认生成的脚本,没有递归拷贝,我们需要手动加上 /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
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
引用:https://blog.csdn.net/songhuangong123/article/details/127864484