在网上找了几个脚本,原理都是读取注册表进行判断,都可以用。

1、CheckDotNetFramework

/** Name: CheckDotNetFramework.nsh* Version: 0.1* Date: 20110720** Author: Michael Mefford* Contact info: meffordm@gmail.com** Description: NSIS header file to check a windows system for a specified .NET*              framework.  CheckDotNetFramework.nsh uses the NSIS stack to*              receive and pass values.** Modified from: http://nsis.sourceforge.net/How_to_Detect_any_.NET_Framework** License: Copyright (C) 2011  Michael Mefford**          This software is provided 'as-is', without any express or implied*          warranty. In no event will the author(s) be held liable for any*          damages arising from the use of this software.**          Permission is granted to anyone to use this software for any*          purpose, including commercial applications, and to alter it and*          redistribute it freely, subject to the following restrictions:**             1. The origin of this software must not be misrepresented;*                you must not claim that you wrote the original software.*                If you use this software in a product, an acknowledgment in*                the product documentation would be appreciated but is not*                required.**             2. Altered versions must be plainly marked as such,*                and must not be misrepresented as being the original software.**             3. This notice may not be removed or altered from any*                distribution.** Usage: Push ${DotNetFrameworkVersion}*        Call CheckDotNetFramework*        Exch $R0*        StrCmp $R0 "0" found not_found** Algorithm: ...** Input: A .NET Framework version.  This must be verbatim, including major,*        minor, and build version - i.e.**          1.1.4322*          2.0.50727*          3.0*          3.5*          4*          4.0*          .*          .*          .*          etc.** Output: "0" if the requested .Net Framework version IS FOUND*         "1" if the requested .NET Framework version IS NOT FOUND**/Function CheckDotNetFramework/* Exchange $R0 with the top of the stack to get the value passed by caller */Exch $R0/* Save other NSIS registers */Push $R1Push $R2Push $R3/* Zero out $R2 for the indexer */StrCpy $R3 "0"loop:/* Get each sub key under "SOFTWARE\Microsoft\NET Framework Setup\NDP" */EnumRegKey $R1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP" $R3StrCmp $R1 "" version_not_found  /* Requested version is not found */StrCpy $R2 $R1 "" 1              /* Remove "v" from subkey */StrCmp $R2 $R0 version_found     /* Requested version is found */IntOp $R3 $R3 + 1                /* Increment registry key index */Goto loop/* The requested .Net Framework version WAS NOT FOUND on this system */
version_not_found:/* Restore the registers saved earlier */Pop $R3Pop $R2Pop $R1Pop $R0Push "1"  /* Put "1" on the top of the stack for caller to use */Goto end/* The requested .Net Framework version WAS FOUND on this system */
version_found:/* Restore the registers saved earlier */Pop $R3Pop $R2Pop $R1Pop $R0Push "0"  /* Put "0" on the top of the stack for caller to use */
end:FunctionEnd

使用方法:

    ;检查是否安装了3.5StrCpy $DotNetFrameworkVersion 3.5Push $DotNetFrameworkVersionCall CheckDotNetFrameworkExch $R0${If} $R0 == "1" ; 没有找到MessageBox MB_ICONSTOP|MB_OK "程序运行所必需的 Microsoft .NET Framework$DotNetFrameworkVersion 尚未安装,请先安装该组件。" IDYESabort${ElseIf} $R0 == "0" ; 找到指定版本的DotNetFramework;检查是否安装了4.0pop $DotNetFrameworkVersionStrCpy $DotNetFrameworkVersion 4.0Push $DotNetFrameworkVersionCall CheckDotNetFrameworkExch $R0${If} $R0 == "1"MessageBox MB_ICONSTOP|MB_OK "程序运行所必需的 Microsoft .NET Framework$DotNetFrameworkVersion 尚未安装,请先安装该组件。" IDYESabort${EndIf}${Endif}

  

2、GetNetFrameworkVersion

Function GetNetFrameworkVersion;获取.Net Framework版本支持Push $1Push $0ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Install"ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Version"StrCmp $0 1 KnowNetFrameworkVersion +1ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Install"ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Version"StrCmp $0 1 KnowNetFrameworkVersion +1ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "InstallSuccess"ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "Version"StrCmp $0 1 KnowNetFrameworkVersion +1ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Install"ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Version"StrCmp $1 "" +1 +2StrCpy $1 "2.0.50727.832"StrCmp $0 1 KnowNetFrameworkVersion +1ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Install"ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Version"StrCmp $1 "" +1 +2StrCpy $1 "1.1.4322.573"StrCmp $0 1 KnowNetFrameworkVersion +1ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Install"ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Version"StrCmp $1 "" +1 +2StrCpy $1 "1.0.3705.0"StrCmp $0 1 KnowNetFrameworkVersion +1StrCpy $1 "not .NetFramework"KnowNetFrameworkVersion:Pop $0Exch $1
FunctionEnd

  

使用方法:

Call GetNetFrameworkVersionPop $1${If} $1 < '2.0.50727'MessageBox MB_OK "正在安装 .NET Framework..."SetDetailsPrint textonlyDetailPrint "正在安装 .NET Framework..."SetDetailsPrint listonlySetOutPath "$TEMP"SetOverwrite on;File "NetFx20SP2_x86.exe"ExecWait '$TEMP\NetFx20SP2_x86.exe /quiet /norestart' $R1Delete "$TEMP\NetFx20SP2_x86.exe"${EndIf}

  

  

3、封装成宏

这种方式不用在脚本中添加函数代码,复用性好,有两个缺点:1)不能在一个脚本中调用多次进行多个版本的判断;2)参数中必须传入DOTNETVMAJOR DOTNETVMINOR DOTNETVMINORMINOR,如果想查4或者4.0版本,脚本中会变成4.或者4.0.,造成找不到,需要改写一下这个脚本,限于目前自己的水平,还改不了。

!macro DotNetSearch DOTNETVMAJOR DOTNETVMINOR DOTNETVMINORMINOR DOTNETLASTFUNCTION DOTNETPATHVar /GLOBAL DOTNET1Var /GLOBAL DOTNET2Var /GLOBAL DOTNET3Var /GLOBAL DOTNET4Var /GLOBAL DOTNET5Var /GLOBAL DOTNET6Push $DOTNET1Push $DOTNET2Push $DOTNET3Push $DOTNET4Push $DOTNET5Push $DOTNET6StrCpy $DOTNET1 "0"StrCpy $DOTNET2 "SOFTWARE\Microsoft\.NETFramework"StrCpy $DOTNET3 0DotNetStartEnum:EnumRegKey $DOTNET4 HKLM "$DOTNET2\policy" $DOTNET3StrCmp $DOTNET4 "" noDotNet dotNetFounddotNetFound:StrCpy $DOTNET5 $DOTNET4 1 0StrCmp $DOTNET5 "v" +1 goNextDotNetStrCpy $DOTNET5 $DOTNET4 1 1IntCmp $DOTNET5 ${DOTNETVMAJOR} +1 goNextDotNet yesDotNetRegStrCpy $DOTNET5 $DOTNET4 1 3IntCmp $DOTNET5 ${DOTNETVMINOR} +1 goNextDotNet yesDotNetRegStrCmp ${DOTNETVMINORMINOR} "" yesDotNetReg   yesDotNetReg;StrCmp ${DOTNETVMINORMINOR} "" yesDotNetReg +1;Changed this line (otherwise it would not work with my setup!) - Vinz0rIntCmpU $DOTNET5 ${DOTNETVMINORMINOR} yesDotNetReg goNextDotNet yesDotNetReggoNextDotNet:IntOp $DOTNET3 $DOTNET3 + 1Goto DotNetStartEnumyesDotNetReg:EnumRegValue $DOTNET3 HKLM "$DOTNET2\policy\$DOTNET4" 0StrCmp $DOTNET3 "" noDotNetReadRegStr $DOTNET5 HKLM $DOTNET2 "InstallRoot"StrCmp $DOTNET5 "" noDotNetStrCpy $DOTNET5 "$DOTNET5$DOTNET4.$DOTNET3\mscorlib.dll"IfFileExists $DOTNET5 yesDotNet noDotNetnoDotNet:StrCmp ${DOTNETLASTFUNCTION} "INSTALL_ABORT" +1 nDN2MessageBox MB_YESNO|MB_ICONQUESTION \"You must have Microsoft .NET Framework version ${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR}$\nor higher installed. Install now?" \IDYES +2 IDNO +1AbortExecWait '${DOTNETPATH}'Goto DotNetStartEnumnDN2:StrCmp ${DOTNETLASTFUNCTION} "INSTALL_NOABORT" +1 nDN3MessageBox MB_YESNO|MB_ICONQUESTION \"Microsoft .NET Framework version ${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed.$\nDo so now?" \IDYES +1 IDNO +3ExecWait '${DOTNETPATH}'Goto DotNetStartEnumStrCpy $DOTNET1 0Goto DotNetFinishnDN3:StrCmp ${DOTNETLASTFUNCTION} "WARNING" +1 nDN4MessageBox MB_OK|MB_ICONEXCLAMATION \"Warning:$\n$\n$\t$\tMicrosoft .NET Framework version$\n$\t$\t${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed!" \IDOK 0StrCpy $DOTNET1 0Goto DotNetFinishnDN4:StrCmp ${DOTNETLASTFUNCTION} "ABORT" +1 nDN5MessageBox MB_OK|MB_ICONEXCLAMATION \"Error:$\n$\n$\t$\tMicrosoft .NET Framework version$\n$\t$\t${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed, aborting!" \IDOK 0AbortnDN5:StrCmp ${DOTNETLASTFUNCTION} "IGNORE" +1 nDN6StrCpy $DOTNET1 0Goto DotNetFinishnDN6:MessageBox MB_OK \"$(^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..." \IDOK 0AbortyesDotNet:StrCpy $DOTNET1 1DotNetFinish:Pop $DOTNET6Pop $DOTNET5Pop $DOTNET4Pop $DOTNET3Pop $DOTNET2!define ${DOTNETOUTCOME} $DOTNET1Exch $DOTNET1
!macroend

  

转载于:https://www.cnblogs.com/ITGIS/p/3377770.html

NSIS中判断.net framework 是否安装相关推荐

  1. NSIS:判断并安装.NET Framework的例子(转载)

    NSIS:判断并安装.NET Framework的例子 现在.NET开发的软件已经大行其道,但有些操作系统并不符合软件的运行要求,所以,我们需要在安装程序中进行.NET Framework的判断,如果 ...

  2. NSIS:判断并安装.NET Framework 4 的例子

    NSIS:判断并安装.NET Framework 4 的例子 原文 NSIS:判断并安装.NET Framework 4 的例子 现在.NET开发的软件已经大行其道,但有些操作系统并不符合软件的运行要 ...

  3. Wix安装程序中判断是否安装的.net framwork 4.5

    Wix安装程序中判断是否安装的.net framwork 4.5 <PropertyRef Id="NETFRAMEWORK40FULL"/> <Property ...

  4. Windows安装.net Framework时安装不上,提示已处理证书链,但是在不受信任提供程序信任的根证书中终止

    解决Windows安装.net Framework时安装不上,提示已处理证书链,但是在不受信任提供程序信任的根证书中终止. 通过网上资料查询找到了以一个可以解决此问题的博客,这里把连接放到这.下次在遇 ...

  5. android 判断安装微信,Android开发中判断手机是否安装了QQ或者微信

    下面一段代码给大家分享了android中判断手机是否安装了qq或者微信,代码简单易懂,非常不错,具有参考借鉴价值,需要的的朋友参考下吧 public static boolean isWeixinAv ...

  6. safari中判断app是否安装

    转载自http://m.blog.csdn.net/blog/wangyx810328/9345817 最近遇到一个需求,需要在safari中判断用户在设备上是否安装了某App,如果安装了则自动启动此 ...

  7. 解决Windows安装.net Framework时安装不上,提示已处理证书链,但是在不受信任提供程序信任的根证书中终止。

    解决Windows安装.net Framework时安装不上,提示已处理证书链,但是在不受信任提供程序信任的根证书中终止. 通过网上资料查询找到了以一个可以解决此问题的博客,这里把连接放到这.下次在遇 ...

  8. NSIS使用教程(安装包制作安装文件教程,如何封装打包文件) 中文版

    NSIS使用教程(安装包制作安装文件教程,如何封装打包文件) 中文版 原文:NSIS使用教程(安装包制作安装文件教程,如何封装打包文件) 中文版 nsis中文版(Nullsoft Scriptable ...

  9. java 判断 中文字符_java中判断字符串中是否有中文字符

    package com.meritit.test; public class TestChart { public static void main(String[] args) throws Exc ...

最新文章

  1. 那些想坐等AI成熟再采用的公司,可能永远也跟不上AI浪潮
  2. RMAN 系列(二) ---- RMAN 设置和配置
  3. can与could区别
  4. linux 读取飞信信息,Linux下飞信
  5. MySQL修改数据类型语句
  6. 原生js调用json方法
  7. 解决vim中鼠标右键无法复制的问题
  8. ES6 String和Number扩展
  9. Windows - 修复所有快捷方式的打开方式
  10. 地学计算方法/地统计学(5第五章 空间插值与克里格法)
  11. 利用netstat查看http为短连接还是长连接?
  12. android仿iphone日期时间选择器,jquery仿苹果的时间/日期选择效果
  13. c语言扩展编译器,TKStudio内置51编译器SDCC对C语言的扩展(2)
  14. Vue3.x的安装和初始化
  15. 单片机拟真电路图软件_单片机电流检测电路图大全(四款模拟电路设计原理图详解)...
  16. 为什么 Flutter 是跨平台开发的终极之选
  17. 支持历史阅读记录的PDF阅读工具
  18. 关于spring data jpa 仓储层自动实现
  19. 细粒度检索SCDA 详解
  20. php获取附近的商家

热门文章

  1. 清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦
  2. spring装配Bean过程
  3. WP8.1程序开发,可视树VisualTreeHelper类的使用
  4. Hadoop项目实战-用户行为分析之应用概述(二)
  5. Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解
  6. 浅谈DevExpress六:为chart创建动态数据源
  7. 读书笔记:《图解HTTP》第一章 网络基础
  8. 小程序的项目结构设计
  9. LayoutInflate部分源码解析
  10. 【03-14】日常资源访问备份