我想使用NSIS脚本安装Java,但我必须知道系统中是否安装了Java(Windows)。根据注册码,我们如何检查是否安装了Java?
任何人都可以提供NSIS脚本来检查基于注册密钥的Java安装吗?
答案 0 :(得分:3)
我没有编译它,但我会尝试跟随。我根据How can I detect the installed Sun JRE on Windows?选择了注册表项。
;--------------------------------
;Defines
!define JavaRegKey 'HKLM "Software\JavaSoft\Java Runtime Environment" ""'
;--------------------------------
;Installer Sections
Section 'Java Runtime' SecJava
SetOutPath '$TEMP'
SetOverwrite on
File 'c:\<yourdir>\javasetup.exe'
ExecWait '$TEMP\javasetup.exe' $0
DetailPrint '..Java Runtime Setup exit code = $0'
Delete '$TEMP\javasetup.exe'
SectionEnd
;--------------------------------
; Functions
Function .onInit
ReadRegStr $R0 ${JavaRegKey}
StrCmp $R0 "" JavaMissing JavaFound
JavaFound:
!insertmacro UnselectSection ${SecJava}
Goto JavaCheckDone
JavaMissing:
!insertmacro SelectSection ${SecJava}
JavaCheckDone:
FunctionEnd
答案 1 :(得分:3)
以下代码片段检查是否安装了Java(jre或jdk)。
如果未安装Java,则会安装它。
该脚本还在变量$JavaInstallationPath
中保存Java的路径。
Var JavaInstallationPath
Section "Find Java" FINDJAVA
DetectTry1:
StrCpy $1 "SOFTWARE\JavaSoft\Java Runtime Environment"
StrCpy $2 0
ReadRegStr $2 HKLM "$1" "CurrentVersion"
StrCmp $2 "" DetectTry2 JRE
JRE:
ReadRegStr $5 HKLM "$1\$2" "JavaHome"
StrCmp $5 "" DetectTry2 GetValue
DetectTry2:
ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Development Kit" "CurrentVersion"
StrCmp $2 "" NoJava JDK
JDK:
ReadRegStr $5 HKLM "SOFTWARE\JavaSoft\Java Development Kit\$2" "JavaHome"
StrCmp $5 "" NoJava GetValue
GetValue:
StrCpy $JavaInstallationPath $5
Messagebox MB_OK "Javahome value: $JavaInstallationPath"
Goto done
NoJava:
Messagebox MB_OK "No Java installation detected. Installing Java."
# Install Java
ExecWait "$INSTDIR\java\jre-6u26-windows-i586.exe"
Goto DetectTry1
done:
#$JavaInstallationPath should contain the system path to Java
SectionEnd
我认为你也可以将上面的代码放在一个函数中,并在NSIS脚本中的任何地方调用它。
答案 2 :(得分:2)
使用在线jre安装程序和64/32位检查的另一个示例
java min version
!define JRE_VERSION_6 "1.5"
检查功能
Function DetectJRE
;64bit jre und jdk check
SetRegView 64
ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" \
"CurrentVersion"
;StrCmp $2 ${JRE_VERSION_6} done
${VersionCompare} $2 ${JRE_VERSION_6} $R0
StrCmp $R0 "1" done
ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Development Kit" \
"CurrentVersion"
;StrCmp $2 ${JRE_VERSION_6} done
${VersionCompare} $2 ${JRE_VERSION_6} $R0
StrCmp $R0 "1" done
;32bit jre und jdk check
SetRegView 32
ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" \
"CurrentVersion"
;StrCmp $2 ${JRE_VERSION_6} done
${VersionCompare} $2 ${JRE_VERSION_6} $R0
StrCmp $R0 "1" done
ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Development Kit" \
"CurrentVersion"
;StrCmp $2 ${JRE_VERSION_6} done
${VersionCompare} $2 ${JRE_VERSION_6} $R0
StrCmp $R0 "1" done
Call GetJRE
done:
FunctionEnd
版本比较
Function VersionCompare
!define VersionCompare `!insertmacro VersionCompareCall`
!macro VersionCompareCall _VER1 _VER2 _RESULT
Push `${_VER1}`
Push `${_VER2}`
Call VersionCompare
Pop ${_RESULT}
!macroend
Exch $1
Exch
Exch $0
Exch
Push $2
Push $3
Push $4
Push $5
Push $6
Push $7
begin:
StrCpy $2 -1
IntOp $2 $2 + 1
StrCpy $3 $0 1 $2
StrCmp $3 '' +2
StrCmp $3 '.' 0 -3
StrCpy $4 $0 $2
IntOp $2 $2 + 1
StrCpy $0 $0 '' $2
StrCpy $2 -1
IntOp $2 $2 + 1
StrCpy $3 $1 1 $2
StrCmp $3 '' +2
StrCmp $3 '.' 0 -3
StrCpy $5 $1 $2
IntOp $2 $2 + 1
StrCpy $1 $1 '' $2
StrCmp $4$5 '' equal
StrCpy $6 -1
IntOp $6 $6 + 1
StrCpy $3 $4 1 $6
StrCmp $3 '0' -2
StrCmp $3 '' 0 +2
StrCpy $4 0
StrCpy $7 -1
IntOp $7 $7 + 1
StrCpy $3 $5 1 $7
StrCmp $3 '0' -2
StrCmp $3 '' 0 +2
StrCpy $5 0
StrCmp $4 0 0 +2
StrCmp $5 0 begin newer2
StrCmp $5 0 newer1
IntCmp $6 $7 0 newer1 newer2
StrCpy $4 '1$4'
StrCpy $5 '1$5'
IntCmp $4 $5 begin newer2 newer1
equal:
StrCpy $0 0
goto end
newer1:
StrCpy $0 1
goto end
newer2:
StrCpy $0 2
end:
Pop $7
Pop $6
Pop $5
Pop $4
Pop $3
Pop $2
Pop $1
Exch $0
FunctionEnd
getJre
Function GetJRE
MessageBox MB_YESNO "XXXXXX require at least Java 1.5! Do you want to download and install it now?" IDYES doInstall
Abort
doInstall:
StrCpy $2 "$TEMP\Java Runtime Environment.exe"
nsisdl::download /TIMEOUT=30000 ${JRE_URL} $2
Pop $R0 ;Get the return value
StrCmp $R0 "success" +3
MessageBox MB_OK "Download failed: $R0"
Quit
ExecWait $2
Delete $2
Call DetectJRE
FunctionEnd
如果缺少这些东西,你会在nsis-wiki页面找到它