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

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 $R1
Push $R2
Push $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" $R3
StrCmp $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 $R3
Pop $R2
Pop $R1
Pop $R0 Push "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 $R3
Pop $R2
Pop $R1
Pop $R0 Push "0" /* Put "0" on the top of the stack for caller to use */
end: FunctionEnd

使用方法:

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

  

2、GetNetFrameworkVersion

Function GetNetFrameworkVersion
;获取.Net Framework版本支持
Push $1
Push $0
ReadRegDWORD $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 +1
ReadRegDWORD $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 +1
ReadRegDWORD $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 +1
ReadRegDWORD $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 +2
StrCpy $1 "2.0.50727.832"
StrCmp $0 1 KnowNetFrameworkVersion +1
ReadRegDWORD $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 +2
StrCpy $1 "1.1.4322.573"
StrCmp $0 1 KnowNetFrameworkVersion +1
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Install"
ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Version"
StrCmp $1 "" +1 +2
StrCpy $1 "1.0.3705.0"
StrCmp $0 1 KnowNetFrameworkVersion +1
StrCpy $1 "not .NetFramework"
KnowNetFrameworkVersion:
Pop $0
Exch $1
FunctionEnd

  

使用方法:

Call GetNetFrameworkVersion
Pop $1
${If} $1 < '2.0.50727'
MessageBox MB_OK "正在安装 .NET Framework..."
SetDetailsPrint textonly
DetailPrint "正在安装 .NET Framework..."
SetDetailsPrint listonly SetOutPath "$TEMP"
SetOverwrite on
;File "NetFx20SP2_x86.exe"
ExecWait '$TEMP\NetFx20SP2_x86.exe /quiet /norestart' $R1
Delete "$TEMP\NetFx20SP2_x86.exe"
${EndIf}

  

  

3、封装成宏

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

!macro DotNetSearch DOTNETVMAJOR DOTNETVMINOR DOTNETVMINORMINOR DOTNETLASTFUNCTION DOTNETPATH
Var /GLOBAL DOTNET1
Var /GLOBAL DOTNET2
Var /GLOBAL DOTNET3
Var /GLOBAL DOTNET4
Var /GLOBAL DOTNET5
Var /GLOBAL DOTNET6
Push $DOTNET1
Push $DOTNET2
Push $DOTNET3
Push $DOTNET4
Push $DOTNET5
Push $DOTNET6 StrCpy $DOTNET1 "0"
StrCpy $DOTNET2 "SOFTWARE\Microsoft\.NETFramework"
StrCpy $DOTNET3 0 DotNetStartEnum:
EnumRegKey $DOTNET4 HKLM "$DOTNET2\policy" $DOTNET3 StrCmp $DOTNET4 "" noDotNet dotNetFound dotNetFound:
StrCpy $DOTNET5 $DOTNET4 1 0
StrCmp $DOTNET5 "v" +1 goNextDotNet
StrCpy $DOTNET5 $DOTNET4 1 1 IntCmp $DOTNET5 ${DOTNETVMAJOR} +1 goNextDotNet yesDotNetReg
StrCpy $DOTNET5 $DOTNET4 1 3 IntCmp $DOTNET5 ${DOTNETVMINOR} +1 goNextDotNet yesDotNetReg
StrCmp ${DOTNETVMINORMINOR} "" yesDotNetReg yesDotNetReg
;StrCmp ${DOTNETVMINORMINOR} "" yesDotNetReg +1
;Changed this line (otherwise it would not work with my setup!) - Vinz0r IntCmpU $DOTNET5 ${DOTNETVMINORMINOR} yesDotNetReg goNextDotNet yesDotNetReg goNextDotNet:
IntOp $DOTNET3 $DOTNET3 + 1
Goto DotNetStartEnum yesDotNetReg:
EnumRegValue $DOTNET3 HKLM "$DOTNET2\policy\$DOTNET4" 0
StrCmp $DOTNET3 "" noDotNet
ReadRegStr $DOTNET5 HKLM $DOTNET2 "InstallRoot"
StrCmp $DOTNET5 "" noDotNet
StrCpy $DOTNET5 "$DOTNET5$DOTNET4.$DOTNET3\mscorlib.dll"
IfFileExists $DOTNET5 yesDotNet noDotNet noDotNet:
StrCmp ${DOTNETLASTFUNCTION} "INSTALL_ABORT" +1 nDN2
MessageBox MB_YESNO|MB_ICONQUESTION \
"You must have Microsoft .NET Framework version ${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR}$\nor higher installed. Install now?" \
IDYES +2 IDNO +1
Abort
ExecWait '${DOTNETPATH}'
Goto DotNetStartEnum
nDN2:
StrCmp ${DOTNETLASTFUNCTION} "INSTALL_NOABORT" +1 nDN3
MessageBox MB_YESNO|MB_ICONQUESTION \
"Microsoft .NET Framework version ${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed.$\nDo so now?" \
IDYES +1 IDNO +3
ExecWait '${DOTNETPATH}'
Goto DotNetStartEnum
StrCpy $DOTNET1 0
Goto DotNetFinish
nDN3:
StrCmp ${DOTNETLASTFUNCTION} "WARNING" +1 nDN4
MessageBox MB_OK|MB_ICONEXCLAMATION \
"Warning:$\n$\n$\t$\tMicrosoft .NET Framework version$\n$\t$\t${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed!" \
IDOK 0
StrCpy $DOTNET1 0
Goto DotNetFinish
nDN4:
StrCmp ${DOTNETLASTFUNCTION} "ABORT" +1 nDN5
MessageBox MB_OK|MB_ICONEXCLAMATION \
"Error:$\n$\n$\t$\tMicrosoft .NET Framework version$\n$\t$\t${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed, aborting!" \
IDOK 0
Abort
nDN5:
StrCmp ${DOTNETLASTFUNCTION} "IGNORE" +1 nDN6
StrCpy $DOTNET1 0
Goto DotNetFinish
nDN6:
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 0
Abort yesDotNet:
StrCpy $DOTNET1 1 DotNetFinish:
Pop $DOTNET6
Pop $DOTNET5
Pop $DOTNET4
Pop $DOTNET3
Pop $DOTNET2
!define ${DOTNETOUTCOME} $DOTNET1
Exch $DOTNET1
!macroend

  

NSIS中判断.net framework 是否安装的更多相关文章

  1. 在手机浏览器中判断App是否已安装

    从网上搜到之前手机中判断App是否安装可以通过onblur事件+定时器来实现. 但现在要做这个功能时,按网上的说法已经不能实现了.因为现在浏览器中打开App,window不会触发onblur事件. 在 ...

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

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

  3. delphi判断.net FrameWork是否已安装

    判断系统中.NET FrameWork已安装版本的方法很多,比如检查C:\Windows\Microsoft.NET\Framework\下的子目录,但是子目录往往是包含版本号,比如v2.0.5072 ...

  4. HTML中判断手机是否安装某APP,跳转或下载该应用

    有些时候在做前端输出的时候,需要和app的做些对接工作.就是在手机浏览器中下载某app时,能判断该用户是否安装了该应用.如果安装了该应用,就直接打开该应用:如果没有安装该应用,就下载该应用.那么下面就 ...

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

    nsis中文版(Nullsoft Scriptable Install System)是一个专业的开源的可以用来封闭Windows程序的实用工具,是一个开源的 Windows 系统下安装程序制作程序. ...

  6. bat代码中判断 bat是否是以管理员权限运行,以及自动以管理员权限运行CMD BAT

    · bat 代码中判断bat是否是以管理员权限运行,以及自动以管理员权限运行CMD BAT 一.判断bat是否是以管理员权限运行 @echo off net.exe session >NUL & ...

  7. Entity Framework 教程——安装Entity Framework环境

    安装Entity Framework环境 Entity Framework 5.0 API分布在两个地方,一个可在NuGet包管理器中找到,一个存在于.NET framework中..NET fram ...

  8. 如何在ASP.NET Core中应用Entity Framework

    注:本文提到的代码示例下载地址> How to using Entity Framework DB first in ASP.NET Core 如何在ASP.NET Core中应用Entity ...

  9. Robot Framework 的安装和配置(转载)

    Robot Framework 的安装和配置 在使用 RF(Rebot framework)的时候需要 Python 或 Jython 环境,具体可根据自己的需求来确定.本文以在有 Python 的环 ...

随机推荐

  1. jquery的上传控件uploadly,每行都有一个这样的控件对id选择器的使用

    1.先看看预览图 这个是我的页面,其中如果我没点击添加一行的时候,会把本来有的数据进行循环出来,这个时候每个记录都必须有个上传图片的按钮,但是jquery的uploadly这个控件只是锁定id的,至少 ...

  2. CentOS 5.X安装LAMP最高版本环境

    #------------CentOS 5.X安装LAMP最高版本环境------------------#! /bin/sh #安装Apacheyum install httpd -y#1.关闭se ...

  3. Pass Dynamic Value to a Grid Label

     A grid label is the blue (normally) colored grid header that you see on PeopleSoft pages. The grid ...

  4. Lucene全文检索框架

    1.什么时Lucene? 是一个全文搜索框架,而不是应用产品,他只是一种工具让你能实现某些产品,并不像www.baidu.com拿来就能用 是apache组织的一个用java实现的全文搜索引擎的开源项 ...

  5. PHP file_get_contents于curl性能效率比较

    说明大部分内容整理来源于网络,期待你的补充.及不当之处的纠正: 1)fopen/file_get_contents 每次请求远程URL中的数据都会重新做DNS查询,并不对DNS信息进行缓存.但是CUR ...

  6. Nginx安装第二步手动下载依赖包

    nginx可以使用各平台的默认包来安装,本文是介绍使用源码编译安装,包括具体的编译参数信息. 正式开始前,编译环境gcc g++ 开发库之类的需要提前装好,这里默认你已经装好. ububtu平台编译环 ...

  7. PHP实例 表单数据插入数据库及数据提取 用户注册验证

    网站在进行新用户注册时,都会将用户的注册信息存入数据库中,需要的时候再进行提取.今天写了一个简单的实例. 主要完成以下几点功能: (1)用户进行注册,实现密码重复确认,验证码校对功能. (2)注册成功 ...

  8. VS活动解决方案平台

    测试环境:win7 x64 测试程序:WCF查询数据库后将数据集返回到Winform程序加载并显示 测试结果: 1.从感觉来说Exe在 x86目标平台生成,启动速度快. 2.内存消耗:x86的程序在超 ...

  9. C#高级功能(四)扩展方法和索引

    扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.扩展方法被定义为静态方法,但 ...

  10. Hadoop伪分布式搭建CentOS

    所需软件及版本: jdk-7u80-linux-x64.tar.gz hadoop-2.6.0.tar.gz 1.安装JDK Hadoop 在需在JDK下运行,注意JDK最好使用Oracle的否则可能 ...