NSIS:判断并安装.NET Framework 4 -安装不了解决方案

在NSIS下判断Microsoft .NET Framework版本并进行安装,网上的教程大多数都是以下的示例。然后在我实际使用中却发现有问题。

首先,我们在Function区段进行当前.NET版本判断:

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

然后,在Section区段进行.NET静默安装:

Section -.NET
    Call GetNetFrameworkVersion
    Pop $R1
    ${If} $R1 < '4.6.01590'
        SetDetailsPrint textonly
        nsSkinEngine::SetControlData "progressTip"  "正在安装.NET Framework 4,请耐心等候..."  "text"
        SetDetailsPrint listonly
        SetOutPath "$TEMP"
        SetOverwrite on
        File "..\Library\Microsoft .NET Framework 4.6.2.exe"
        ExecWait '$TEMP\Microsoft .NET Framework 4.6.2 /q /norestart /ChainingPackage FullX64Bootstrapper' $R1
        Delete "$TEMP\Microsoft .NET Framework 4.6.2.exe"
    ${EndIf}
SectionEnd

问题重现:计算机已安装.NET Framework 4.5.2,实际需要安装.NET Framework 4.6.2,这时按如上写法是不会安装.NET Framework 4.6.2的。

原因分析:经输出日志发现,问题出现在${If} $R1 < '4.6.01590'这一句上。$R1获取到的值为4.5.51209 (.NET Framework 4.6.2对应版本为4.6.01590),实际是没有执行IF语句块。

解决办法:因为我不知道如何让${If} $R1 < '4.6.01590'语句生效,所以我采用了其它写法。写法如下

Section -.NET Framework
    Call GetNetFrameworkVersion
    Pop $R1
    ${VersionCompare} $R1 '4.6.01590' $1
    ${If} $1 == '2'
        SetDetailsPrint textonly
        nsSkinEngine::SetControlData "progressTip"  "正在安装.NET Framework 4.6.2,请耐心等候..."  "text"
        SetDetailsPrint listonly
        SetOutPath "$TEMP"
        SetOverwrite on
        File "..\Library\Microsoft .NET Framework 4.6.2.exe"
        ExecWait '$TEMP\Microsoft .NET Framework 4.6.2 /q /norestart /ChainingPackage FullX64Bootstrapper' $R1
        Delete "$TEMP\Microsoft .NET Framework 4.6.2.exe"
    ${EndIf}
SectionEnd

需要注意的是必须在脚本前面引用!include “WordFunc.nsh”。因为VersionCompare函数存在于此文件中。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值