杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2827|回复: 1

NSIS中判断.net framework 是否安装

[复制链接]
发表于 2016-9-2 18:50:15 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1、CheckDotNetFramework
  1. /*
  2. * Name: CheckDotNetFramework.nsh
  3. * Version: 0.1
  4. * Date: 20110720
  5. *
  6. * Author: Michael Mefford
  7. * Contact info: meffordm@gmail.com
  8. *
  9. * Description: NSIS header file to check a windows system for a specified .NET
  10. *              framework.  CheckDotNetFramework.nsh uses the NSIS stack to
  11. *              receive and pass values.
  12. *
  13. * Modified from: http://nsis.sourceforge.net/How_to_Detect_any_.NET_Framework
  14. *
  15. * License: Copyright (C) 2011  Michael Mefford
  16. *
  17. *          This software is provided 'as-is', without any express or implied
  18. *          warranty. In no event will the author(s) be held liable for any
  19. *          damages arising from the use of this software.
  20. *
  21. *          Permission is granted to anyone to use this software for any
  22. *          purpose, including commercial applications, and to alter it and
  23. *          redistribute it freely, subject to the following restrictions:
  24. *
  25. *             1. The origin of this software must not be misrepresented;
  26. *                you must not claim that you wrote the original software.
  27. *                If you use this software in a product, an acknowledgment in
  28. *                the product documentation would be appreciated but is not
  29. *                required.
  30. *
  31. *             2. Altered versions must be plainly marked as such,
  32. *                and must not be misrepresented as being the original software.
  33. *
  34. *             3. This notice may not be removed or altered from any
  35. *                distribution.
  36. *
  37. * Usage: Push ${DotNetFrameworkVersion}
  38. *        Call CheckDotNetFramework
  39. *        Exch $R0
  40. *        StrCmp $R0 "0" found not_found
  41. *
  42. * Algorithm: ...
  43. *
  44. * Input: A .NET Framework version.  This must be verbatim, including major,
  45. *        minor, and build version - i.e.
  46. *
  47. *          1.1.4322
  48. *          2.0.50727
  49. *          3.0
  50. *          3.5
  51. *          4
  52. *          4.0
  53. *          .
  54. *          .
  55. *          .
  56. *          etc.
  57. *
  58. * Output: "0" if the requested .Net Framework version IS FOUND
  59. *         "1" if the requested .NET Framework version IS NOT FOUND
  60. *
  61. */
  62. Function CheckDotNetFramework

  63.   /* Exchange $R0 with the top of the stack to get the value passed by caller */
  64.   Exch $R0

  65.   /* Save other NSIS registers */
  66.   Push $R1
  67.   Push $R2
  68.   Push $R3

  69.   /* Zero out $R2 for the indexer */
  70.   StrCpy $R3 "0"

  71. loop:
  72.   /* Get each sub key under "SOFTWARE\Microsoft\NET Framework Setup\NDP" */
  73.   EnumRegKey $R1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP" $R3
  74.   StrCmp $R1 "" version_not_found  /* Requested version is not found */

  75.   StrCpy $R2 $R1 "" 1              /* Remove "v" from subkey */
  76.   StrCmp $R2 $R0 version_found     /* Requested version is found */

  77.   IntOp $R3 $R3 + 1                /* Increment registry key index */
  78.   Goto loop

  79. /* The requested .Net Framework version WAS NOT FOUND on this system */
  80. version_not_found:
  81.   /* Restore the registers saved earlier */
  82.   Pop $R3
  83.   Pop $R2
  84.   Pop $R1
  85.   Pop $R0

  86.   Push "1"  /* Put "1" on the top of the stack for caller to use */
  87.   Goto end

  88. /* The requested .Net Framework version WAS FOUND on this system */
  89. version_found:
  90.   /* Restore the registers saved earlier */
  91.   Pop $R3
  92.   Pop $R2
  93.   Pop $R1
  94.   Pop $R0

  95.   Push "0"  /* Put "0" on the top of the stack for caller to use */
  96. end:

  97. FunctionEnd<br><br>
复制代码

使用方法:
  1.   ;检查是否安装了3.5
  2. StrCpy $DotNetFrameworkVersion 3.5
  3.   Push $DotNetFrameworkVersion
  4. Call CheckDotNetFramework
  5. Exch $R0
  6. ${If} $R0 == "1" ; 没有找到
  7.    MessageBox MB_ICONSTOP|MB_OK "程序运行所必需的 Microsoft .NET Framework$DotNetFrameworkVersion 尚未安装,请先安装该组件。" IDYES
  8.        abort
  9. ${ElseIf} $R0 == "0" ; 找到指定版本的DotNetFramework
  10.       ;检查是否安装了4.0
  11.       pop $DotNetFrameworkVersion
  12.           StrCpy $DotNetFrameworkVersion 4.0
  13.           Push $DotNetFrameworkVersion
  14.           Call CheckDotNetFramework
  15.       Exch $R0
  16.       ${If} $R0 == "1"
  17.               MessageBox MB_ICONSTOP|MB_OK "程序运行所必需的 Microsoft .NET Framework$DotNetFrameworkVersion 尚未安装,请先安装该组件。" IDYES
  18.               abort
  19.       ${EndIf}
  20. ${Endif}
复制代码


2、GetNetFrameworkVersion
  1. Function GetNetFrameworkVersion
  2.     ;获取.Net Framework版本支持
  3.     Push $1
  4.     Push $0
  5.     ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Install"
  6.     ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Version"
  7.     StrCmp $0 1 KnowNetFrameworkVersion +1
  8.     ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Install"
  9.     ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Version"
  10.     StrCmp $0 1 KnowNetFrameworkVersion +1
  11.     ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "InstallSuccess"
  12.     ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "Version"
  13.     StrCmp $0 1 KnowNetFrameworkVersion +1
  14.     ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Install"
  15.     ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Version"
  16.     StrCmp $1 "" +1 +2
  17.     StrCpy $1 "2.0.50727.832"
  18.     StrCmp $0 1 KnowNetFrameworkVersion +1
  19.     ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Install"
  20.     ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Version"
  21.     StrCmp $1 "" +1 +2
  22.     StrCpy $1 "1.1.4322.573"
  23.     StrCmp $0 1 KnowNetFrameworkVersion +1
  24.     ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Install"
  25.     ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Version"
  26.     StrCmp $1 "" +1 +2
  27.     StrCpy $1 "1.0.3705.0"
  28.     StrCmp $0 1 KnowNetFrameworkVersion +1
  29.     StrCpy $1 "not .NetFramework"
  30.     KnowNetFrameworkVersion:
  31.     Pop $0
  32.     Exch $1
  33. FunctionEnd
复制代码

使用方法:
  1. Call GetNetFrameworkVersion
  2.   Pop $1
  3.   ${If} $1 < '2.0.50727'
  4.   MessageBox MB_OK "正在安装 .NET Framework..."
  5.   SetDetailsPrint textonly
  6.   DetailPrint "正在安装 .NET Framework..."
  7.   SetDetailsPrint listonly

  8.   SetOutPath "$TEMP"
  9.   SetOverwrite on
  10.   ;File "NetFx20SP2_x86.exe"
  11.   ExecWait '$TEMP\NetFx20SP2_x86.exe /quiet /norestart' $R1
  12.   Delete "$TEMP\NetFx20SP2_x86.exe"
  13.   ${EndIf}
复制代码

3、封装成宏

这种方式不用在脚本中添加函数代码,复用性好,有两个缺点:1)不能在一个脚本中调用多次进行多个版本的判断;2)参数中必须传入DOTNETVMAJOR DOTNETVMINOR DOTNETVMINORMINOR,如果想查4或者4.0版本,脚本中会变成4.或者4.0.,造成找不到,需要改写一下这个脚本,限于目前自己的水平,还改不了。
  1. !macro DotNetSearch DOTNETVMAJOR DOTNETVMINOR DOTNETVMINORMINOR DOTNETLASTFUNCTION DOTNETPATH
  2.     Var /GLOBAL DOTNET1
  3.     Var /GLOBAL DOTNET2
  4.     Var /GLOBAL DOTNET3
  5.     Var /GLOBAL DOTNET4
  6.     Var /GLOBAL DOTNET5
  7.     Var /GLOBAL DOTNET6
  8.     Push $DOTNET1
  9.     Push $DOTNET2
  10.     Push $DOTNET3
  11.     Push $DOTNET4
  12.     Push $DOTNET5
  13.     Push $DOTNET6

  14.     StrCpy $DOTNET1 "0"
  15.     StrCpy $DOTNET2 "SOFTWARE\Microsoft\.NETFramework"
  16.     StrCpy $DOTNET3 0

  17.     DotNetStartEnum:
  18.         EnumRegKey $DOTNET4 HKLM "$DOTNET2\policy" $DOTNET3
  19.          
  20.         StrCmp $DOTNET4 "" noDotNet dotNetFound

  21.     dotNetFound:
  22.         StrCpy $DOTNET5 $DOTNET4 1 0
  23.         StrCmp $DOTNET5 "v" +1 goNextDotNet
  24.         StrCpy $DOTNET5 $DOTNET4 1 1

  25.         IntCmp $DOTNET5 ${DOTNETVMAJOR} +1 goNextDotNet yesDotNetReg
  26.     StrCpy $DOTNET5 $DOTNET4 1 3
  27.      
  28.         IntCmp $DOTNET5 ${DOTNETVMINOR} +1 goNextDotNet yesDotNetReg
  29.         StrCmp ${DOTNETVMINORMINOR} "" yesDotNetReg   yesDotNetReg
  30.         ;StrCmp ${DOTNETVMINORMINOR} "" yesDotNetReg +1
  31.         ;Changed this line (otherwise it would not work with my setup!) - Vinz0r

  32.     IntCmpU $DOTNET5 ${DOTNETVMINORMINOR} yesDotNetReg goNextDotNet yesDotNetReg

  33.     goNextDotNet:
  34.         IntOp $DOTNET3 $DOTNET3 + 1
  35.         Goto DotNetStartEnum

  36.     yesDotNetReg:
  37.         EnumRegValue $DOTNET3 HKLM "$DOTNET2\policy\$DOTNET4" 0
  38.         StrCmp $DOTNET3 "" noDotNet
  39.         ReadRegStr $DOTNET5 HKLM $DOTNET2 "InstallRoot"
  40.         StrCmp $DOTNET5 "" noDotNet
  41.         StrCpy $DOTNET5 "$DOTNET5$DOTNET4.$DOTNET3\mscorlib.dll"
  42.         IfFileExists $DOTNET5 yesDotNet noDotNet

  43.     noDotNet:
  44.         StrCmp ${DOTNETLASTFUNCTION} "INSTALL_ABORT" +1 nDN2
  45.             MessageBox MB_YESNO|MB_ICONQUESTION \
  46.             "You must have Microsoft .NET Framework version ${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR}$\nor higher installed. Install now?" \
  47.             IDYES +2 IDNO +1
  48.             Abort
  49.             ExecWait '${DOTNETPATH}'
  50.             Goto DotNetStartEnum
  51.     nDN2:
  52.         StrCmp ${DOTNETLASTFUNCTION} "INSTALL_NOABORT" +1 nDN3
  53.             MessageBox MB_YESNO|MB_ICONQUESTION \
  54.             "Microsoft .NET Framework version ${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed.$\nDo so now?" \
  55.             IDYES +1 IDNO +3
  56.             ExecWait '${DOTNETPATH}'
  57.             Goto DotNetStartEnum
  58.             StrCpy $DOTNET1 0
  59.             Goto DotNetFinish
  60.     nDN3:
  61.         StrCmp ${DOTNETLASTFUNCTION} "WARNING" +1 nDN4
  62.             MessageBox MB_OK|MB_ICONEXCLAMATION \
  63.             "Warning:$\n$\n$\t$\tMicrosoft .NET Framework version$\n$\t$\t${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed!" \
  64.             IDOK 0
  65.             StrCpy $DOTNET1 0
  66.             Goto DotNetFinish
  67.     nDN4:
  68.         StrCmp ${DOTNETLASTFUNCTION} "ABORT" +1 nDN5
  69.             MessageBox MB_OK|MB_ICONEXCLAMATION \
  70.             "Error:$\n$\n$\t$\tMicrosoft .NET Framework version$\n$\t$\t${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed, aborting!" \
  71.             IDOK 0
  72.             Abort
  73.     nDN5:
  74.         StrCmp ${DOTNETLASTFUNCTION} "IGNORE" +1 nDN6
  75.             StrCpy $DOTNET1 0
  76.             Goto DotNetFinish
  77.     nDN6:
  78.         MessageBox MB_OK \
  79.         "$(^Name) Setup internal error.$\nMacro 'DotNetSearch', parameter '4'(${DOTNETLASTFUNCTION})invalid.$\nValue must be INSTALL_ABORT|INSTALL_NOABORT|WARNING|ABORT|IGNORE$\nSorry for the inconvenience.$\n$\tAborting..." \
  80.         IDOK 0
  81.         Abort

  82.     yesDotNet:
  83.         StrCpy $DOTNET1 1

  84.     DotNetFinish:
  85.         Pop $DOTNET6
  86.         Pop $DOTNET5
  87.         Pop $DOTNET4
  88.         Pop $DOTNET3
  89.         Pop $DOTNET2
  90.         !define ${DOTNETOUTCOME} $DOTNET1
  91.         Exch $DOTNET1
  92. !macroend
复制代码
回复

使用道具 举报

发表于 2019-2-26 20:53:54 | 显示全部楼层

NSIS 检测.NET Framework 版本且在线下载

  1. Section -.NET Framework
  2. ;检测是否是需要的.NET Framework版本
  3. Call GetNetFrameworkVersion
  4. Pop $R1
  5. ;${If} $R1 < '2.0.50727'
  6. ;${If} $R1 < '3.5.30729.4926'
  7. ${If} $R1 < '4.0.30319'
  8. ;${If} $R1 < '4.5.52747'
  9. MessageBox MB_YESNO|MB_ICONQUESTION "此软件运行需要.NET Framework 4.0运行环境,但您机器上似乎没有安装此环境。$\r$\n您有两个选择:$\r$\n1.您自己到互联网上下载.NET Framework 4.0安装,然后再运行此软件$\r$\n2.使用此安装程序在线下载并安装.NET Framework 4.0$\r$\n$\r$\n现在在线下载并安装.NET Framework 4.0,请确认您的机器已连接互联网.继续吗?" IDNO +2
  10. Call DownloadNetFramework4
  11. ${ENDIF}
  12. SectionEnd

  13. Function GetNetFrameworkVersion
  14. ;获取.Net Framework版本支持
  15. Push $1
  16. Push $0
  17. ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Install"
  18. ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Version"
  19. StrCmp $0 1 KnowNetFrameworkVersion +1
  20. ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Install"
  21. ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Version"
  22. StrCmp $0 1 KnowNetFrameworkVersion +1
  23. ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "InstallSuccess"
  24. ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "Version"
  25. StrCmp $0 1 KnowNetFrameworkVersion +1
  26. ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Install"
  27. ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Version"
  28. StrCmp $1 "" +1 +2
  29. StrCpy $1 "2.0.50727.832"
  30. StrCmp $0 1 KnowNetFrameworkVersion +1
  31. ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Install"
  32. ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Version"
  33. StrCmp $1 "" +1 +2
  34. StrCpy $1 "1.1.4322.573"
  35. StrCmp $0 1 KnowNetFrameworkVersion +1
  36. ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Install"
  37. ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Version"
  38. StrCmp $1 "" +1 +2
  39. StrCpy $1 "1.0.3705.0"
  40. StrCmp $0 1 KnowNetFrameworkVersion +1
  41. StrCpy $1 "not .NetFramework"
  42. KnowNetFrameworkVersion:
  43. Pop $0
  44. Exch $1
  45. FunctionEnd

  46. Function DownloadNetFramework2
  47. ;下载 .NET Framework 2.0 SP2
  48. NSISdl::download /TRANSLATE2 '正在下载 %s' '正在连接...' '(剩余 1 秒)' '(剩余 1 分钟)' '(剩余 1 小时)' '(剩余 %u 秒)' '(剩余 %u 分钟)' '(剩余 %u 小时)' '已完成:%skB(%d%%) 大小:%skB 速度:%u.%01ukB/s' /TIMEOUT=7500 /NOIEPROXY 'http://download.microsoft.com/download/c/6/e/c6e88215-0178-4c6c-b5f3-158ff77b1f38/NetFx20SP2_x86.exe' '$TEMP\NetFx20SP2_x86.exe'
  49. Pop $R0
  50. StrCmp $R0 "success" 0 +3

  51. SetDetailsPrint textonly
  52. DetailPrint "正在安装 .NET Framework 2.0 SP2..."
  53. SetDetailsPrint listonly
  54. ExecWait '$TEMP\NetFx20SP2_x86.exe /quiet /norestart' $R1
  55. Delete "$TEMP\NetFx20SP2_x86.exe"

  56. FunctionEnd

  57. Function DownloadNetFramework35
  58. ;下载 .NET Framework 3.5 SP1
  59. NSISdl::download /TRANSLATE2 '正在下载 %s' '正在连接...' '(剩余 1 秒)' '(剩余 1 分钟)' '(剩余 1 小时)' '(剩余 %u 秒)' '(剩余 %u 分钟)' '(剩余 %u 小时)' '已完成:%skB(%d%%) 大小:%skB 速度:%u.%01ukB/s' /TIMEOUT=7500 /NOIEPROXY 'http://download.microsoft.com/download/2/0/E/20E90413-712F-438C-988E-FDAA79A8AC3D/dotnetfx35.exe' '$TEMP\dotnetfx35.exe'
  60. Pop $R0
  61. StrCmp $R0 "success" 0 +2

  62. SetDetailsPrint textonly
  63. DetailPrint "正在安装 .NET Framework 3.5 SP1..."
  64. SetDetailsPrint listonly
  65. ExecWait '$TEMP\dotnetfx35.exe /quiet /norestart' $R1
  66. Delete "$TEMP\dotnetfx35.exe"

  67. FunctionEnd

  68. Function DownloadNetFramework4
  69. ;下载 .NET Framework 4.0
  70. NSISdl::download /TRANSLATE2 '正在下载 %s' '正在连接...' '(剩余 1 秒)' '(剩余 1 分钟)' '(剩余 1 小时)' '(剩余 %u 秒)' '(剩余 %u 分钟)' '(剩余 %u 小时)' '已完成:%skB(%d%%) 大小:%skB 速度:%u.%01ukB/s' /TIMEOUT=7500 /NOIEPROXY 'http://download.microsoft.com/download/9/5/A/95A9616B-7A37-4AF6-BC36-D6EA96C8DAAE/dotNetFx40_Full_x86_x64.exe' '$TEMP\dotNetFx40_Full_x86_x64.exe'
  71. Pop $R0
  72. StrCmp $R0 "success" 0 +2

  73. SetDetailsPrint textonly
  74. DetailPrint "正在安装 .NET Framework 4.0 Full..."
  75. SetDetailsPrint listonly
  76. ExecWait '$TEMP\dotNetFx40_Full_x86_x64.exe /quiet /norestart' $R1
  77. Delete "$TEMP\dotNetFx40_Full_x86_x64.exe"

  78. FunctionEnd

  79. Function DownloadNetFramework45
  80. ;下载 .NET Framework 4.5
  81. NSISdl::download /TRANSLATE2 '正在下载 %s' '正在连接...' '(剩余 1 秒)' '(剩余 1 分钟)' '(剩余 1 小时)' '(剩余 %u 秒)' '(剩余 %u 分钟)' '(剩余 %u 小时)' '已完成:%skB(%d%%) 大小:%skB 速度:%u.%01ukB/s' /TIMEOUT=7500 /NOIEPROXY 'http://download.microsoft.com/download/E/2/1/E21644B5-2DF2-47C2-91BD-63C560427900/NDP452-KB2901907-x86-x64-AllOS-ENU.exe' '$TEMP\NDP452-KB2901907-x86-x64-AllOS-ENU.exe'
  82. Pop $R0
  83. StrCmp $R0 "success" 0 +2

  84. SetDetailsPrint textonly
  85. DetailPrint "正在安装 .NET Framework 4.5.2 ..."
  86. SetDetailsPrint listonly
  87. ExecWait '$TEMP\NDP452-KB2901907-x86-x64-AllOS-ENU.exe /quiet /norestart' $R1
  88. Delete "$TEMP\NDP452-KB2901907-x86-x64-AllOS-ENU.exe"

  89. FunctionEnd
复制代码


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-18 03:19 , Processed in 0.124511 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表