在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函数存在于此文件中。