查找已安装的 JRE 版本,如果未找到则安装它
Find version of JRE installed and install it if not found
我正在开发一个子例程,该子例程检查注册表中的 Java 运行时路径,如果未找到,则尝试安装它。我的代码某处有错误,但我盯着它看太久了,找不到它。我 运行 时得到的输出是:
Running Microsoft Windows XP Service Pack 3
Installing HermesJMS.
Checking Java Runtime install path.
The syntax of the command is incorrect.
我很确定错误出在 :FindJRE 子例程中。非常感谢任何帮助。这是我的代码。
::@echo off
setlocal
call :GetOSVer os sp
Echo Running %os% %sp%
call :sleep 2
set key="HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
ECHO Installing HermesJMS.
call :sleep 2
::hermes-installer-1.14.jar
echo Checking Java Runtime install path.
call :sleep 2
call :FindJRE jre
call :sleep 2
echo Setting Java_Home path.
call :sleep 2
reg add %key% /v JAVA_HOME /t REG_SZ /d %jre% /f>nul
For /f "tokens=3 delims= " %%a in ('reg query %key% /v JAVA_HOME^|Find "JAVA_HOME"') do (
Echo Java home path set to: %%a.
)
call :sleep 2
echo Checking for Capitalware...
call :sleep 2
if not exist "C:\Capitalware" (
echo Installing Capitalware
"%~dp0Capitalware\Windows\mqce-setup.exe"
)
call :sleep 2
Echo You can now run HermesJMS.
call :sleep 5
pause
exit /b
:Sleep
@echo off & setlocal
Ping -n %1 127.0.0.1 >nul
exit /b
:GetOSVer
@echo off
set key="HKLM\Software\Microsoft\Windows NT\CurrentVersion"
for /f "skip=1 tokens=3 delims= " %%a in (
'reg query %key% /v ProductName') do (
set "%~1=%%a"
)
for /f "skip=1 tokens=3 delims= " %%a in (
'reg query %key% /v CSDVersion') do (
set "%~2=%%a"
)
exit /b
:FindJRE
::@echo off
setlocal
set KEY_NAME="HKLM\SOFTWARE\JavaSoft\Java Runtime Environment"
FOR /F "usebackq skip=2 tokens=3" %%A IN (
`REG QUERY %KEY_NAME% /v CurrentVersion 2^>nul`
) DO ( set Val=%%~A )
if defined Val (
echo.the current Java runtime is %Val%
) else (
echo.%KEY_NAME%\%VALUE_NAME% not found.
for /f %%a in ('dir /b jre*') do (
Echo.Attempting to install Java Runtime Environment.
echo.Flipping the junkware bit
REG add HKLM\SOFTWARE\JavaSoft /v Sponsors /t REG_SZ /d Disable > nul
set loc="%%a"
If defined %loc% ( %loc%
) ELSE (
Echo.Java installer not found. Please download the latest Java Runtime Environment from the Oracle Website.
exit /b 1
)
)
)
FOR /F "usebackq skip=2 tokens=3*" %%A IN (
`REG QUERY %KEY_NAME%\%Val% /v JavaHome 2^>nul`
) DO (
endlocal
set %~1="%%~A %%~B"
)
exit /b 0
更新版本 - 完全正常工作
:: HermesJMS install script ::
:: Author - Matt Williamson ::
:: Rev 1 - 02/13/15 ::
::::::::::::::::::::::::::::::
@echo off
setlocal
call :GetOSVer os sp
Echo Running %os% %sp%
call :sleep 2
set key="HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
ECHO Installing HermesJMS.
call :sleep 2
hermes-installer-1.14.jar
echo Checking Java install path.
call :sleep 2
call :FindJRE jre
If not %jre% EQU dec (
call :sleep 2
echo Setting Java home path.
call :sleep 2
reg add %key% /v JAVA_HOME /t REG_SZ /d %jre% /f >nul
For /f "skip=4 tokens=3*" %%a in ('reg query %key% /v JAVA_HOME') do (
Echo Java home path set to: %%a %%b
)
) ELSE ( Endlocal&echo You must install Java Runtime Environment for Hermes to work.&exit /b 1)
call :sleep 2
echo Checking for Capitalware...
call :sleep 2
if not exist "C:\Capitalware" (
echo Installing Capitalware
"%~dp0Capitalware\Windows\mqce-setup.exe"
)
call :sleep 5
echo Now running HermesJMS
"C:\Program Files\HermesJMS\bin\hermes.bat"
exit /b 0
:Sleep
@echo off & setlocal
Ping -n %1 127.0.0.1 >nul
exit /b
:GetOSVer
@echo off
set key="HKLM\Software\Microsoft\Windows NT\CurrentVersion"
for /f "skip=4 tokens=3 delims= " %%a in (
'reg query %key% /v ProductName') do (
set "%~1=%%a"
)
for /f "skip=4 tokens=3 delims= " %%a in (
'reg query %key% /v CSDVersion') do (
set "%~2=%%a"
)
exit /b
:FindJRE
@echo off
setlocal enabledelayedexpansion
set "aux1= "
set KEY_NAME="HKLM\SOFTWARE\JavaSoft\Java Runtime Environment"
FOR /F "usebackq skip=4 tokens=3" %%A IN (
`REG QUERY %KEY_NAME% /v CurrentVersion 2^>nul`
) DO ( set "Val=%%~A" )
if defined Val (
echo.the current Java runtime is !Val!
) else (
echo.Java Runtime Environment not found.
for /f %%a in ('dir /b jre*') do (
Echo.Attempting to install Java Runtime Environment.
set "loc=%%a"
If defined loc (
echo.Flipping the junkware bit
REG add HKLM\SOFTWARE\JavaSoft /v Sponsors /t REG_SZ /d Disable /f>nul
Call :SpinnerEx&!loc!
Set Key2="HKLM\SOFTWARE\JavaSoft"
FOR /F "usebackq skip=4 tokens=3" %%G IN (
`REG QUERY !Key2! /v InstallStatus 2^>nul`) do (
If "%%G" EQU "decline" (
Echo JRE install cancelled
Endlocal&Set %~1=dec&exit /b 1
)
)
) ELSE (
Echo.Java installer not found. Please download the latest Java Runtime Environment from the Oracle Website.
exit /b 1
)
)
)
FOR /F "usebackq skip=4 tokens=3*" %%A IN (
`REG QUERY %KEY_NAME%\%Val% /v JavaHome 2^>nul`
) DO (
set "aux1=%%~A %%~B"
)
endlocal&set %~1="%aux1%"&exit /b 0
:SpinnerEx
setlocal EnableDelayedExpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
FOR /L %%n in (1,1,10) DO (
call :spinner
ping localhost -n 1 > nul
)
exit /b
:spinner
set /a "spinner=(spinner + 1) %% 4"
set "spinChars=\|/-"
<nul set /p ".=Waiting for JRE...!spinChars:~%spinner%,1!!CR!"
exit /b
你是对的,错误在:FindJRE
子程序中。这是纠正它的尝试(但我不要求完整性):
@echo on
帮助定位错误源行
- read more 关于
enabledelayedexpansion
并使用 !var!
而不是 %var%
echo REG add ...
命令 echo
ed 因为我不想这样做真的是出于可理解的原因:)
echo !loc!
detto(还有)
set "Val=%%~A"
为变量设置值以确保没有尾随 spaces 的最佳实践
If defined loc (
而不是那个奇怪的怪人 If defined %loc% (
endlocal&set %~1="%aux1%"&exit /b 0
设置输出(通过引用)变量的技巧:
- 使用先前定义的辅助
aux
变量
- 确保没有尾随 space 的另一个技巧:
set %~1="%aux1%"
被 &
和字符包围
- 注意输出
"%aux1%"
可能导致" "
,即space被"
引号
- 抱歉,如果忘记任何更正,因此未在此处列出...
代码:
:FindJRE
@echo on
setlocal enabledelayedexpansion
set "aux1= "
set KEY_NAME="HKLM\SOFTWARE\JavaSoft\Java Runtime Environment"
FOR /F "usebackq skip=2 tokens=3" %%A IN (
`REG QUERY %KEY_NAME% /v CurrentVersion 2^>nul`
) DO ( set "Val=%%~A" )
if defined Val (
echo the current Java runtime is %Val%
) else (
echo.%KEY_NAME%\%VALUE_NAME% not found.
for /f %%a in ('dir /b jre*') do (
Echo.Attempting to install Java Runtime Environment.
echo.Flipping the junkware bit
echo REG add HKLM\SOFTWARE\JavaSoft /v Sponsors /t REG_SZ /d Disable > nul
set loc="%%a"
If defined loc (
echo !loc!
) ELSE (
Echo.Java installer not found. Please download the latest Java Runtime Environment from the Oracle Website.
exit /b 1
)
)
)
FOR /F "usebackq skip=2 tokens=3*" %%A IN (
`REG QUERY %KEY_NAME%\%Val% /v JavaHome 2^>nul`
) DO (
set "aux1=%%~A %%~B"
)
endlocal&set %~1="%aux1%"&exit /b 0
我正在开发一个子例程,该子例程检查注册表中的 Java 运行时路径,如果未找到,则尝试安装它。我的代码某处有错误,但我盯着它看太久了,找不到它。我 运行 时得到的输出是:
Running Microsoft Windows XP Service Pack 3
Installing HermesJMS.
Checking Java Runtime install path.
The syntax of the command is incorrect.
我很确定错误出在 :FindJRE 子例程中。非常感谢任何帮助。这是我的代码。
::@echo off
setlocal
call :GetOSVer os sp
Echo Running %os% %sp%
call :sleep 2
set key="HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
ECHO Installing HermesJMS.
call :sleep 2
::hermes-installer-1.14.jar
echo Checking Java Runtime install path.
call :sleep 2
call :FindJRE jre
call :sleep 2
echo Setting Java_Home path.
call :sleep 2
reg add %key% /v JAVA_HOME /t REG_SZ /d %jre% /f>nul
For /f "tokens=3 delims= " %%a in ('reg query %key% /v JAVA_HOME^|Find "JAVA_HOME"') do (
Echo Java home path set to: %%a.
)
call :sleep 2
echo Checking for Capitalware...
call :sleep 2
if not exist "C:\Capitalware" (
echo Installing Capitalware
"%~dp0Capitalware\Windows\mqce-setup.exe"
)
call :sleep 2
Echo You can now run HermesJMS.
call :sleep 5
pause
exit /b
:Sleep
@echo off & setlocal
Ping -n %1 127.0.0.1 >nul
exit /b
:GetOSVer
@echo off
set key="HKLM\Software\Microsoft\Windows NT\CurrentVersion"
for /f "skip=1 tokens=3 delims= " %%a in (
'reg query %key% /v ProductName') do (
set "%~1=%%a"
)
for /f "skip=1 tokens=3 delims= " %%a in (
'reg query %key% /v CSDVersion') do (
set "%~2=%%a"
)
exit /b
:FindJRE
::@echo off
setlocal
set KEY_NAME="HKLM\SOFTWARE\JavaSoft\Java Runtime Environment"
FOR /F "usebackq skip=2 tokens=3" %%A IN (
`REG QUERY %KEY_NAME% /v CurrentVersion 2^>nul`
) DO ( set Val=%%~A )
if defined Val (
echo.the current Java runtime is %Val%
) else (
echo.%KEY_NAME%\%VALUE_NAME% not found.
for /f %%a in ('dir /b jre*') do (
Echo.Attempting to install Java Runtime Environment.
echo.Flipping the junkware bit
REG add HKLM\SOFTWARE\JavaSoft /v Sponsors /t REG_SZ /d Disable > nul
set loc="%%a"
If defined %loc% ( %loc%
) ELSE (
Echo.Java installer not found. Please download the latest Java Runtime Environment from the Oracle Website.
exit /b 1
)
)
)
FOR /F "usebackq skip=2 tokens=3*" %%A IN (
`REG QUERY %KEY_NAME%\%Val% /v JavaHome 2^>nul`
) DO (
endlocal
set %~1="%%~A %%~B"
)
exit /b 0
更新版本 - 完全正常工作
:: HermesJMS install script ::
:: Author - Matt Williamson ::
:: Rev 1 - 02/13/15 ::
::::::::::::::::::::::::::::::
@echo off
setlocal
call :GetOSVer os sp
Echo Running %os% %sp%
call :sleep 2
set key="HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
ECHO Installing HermesJMS.
call :sleep 2
hermes-installer-1.14.jar
echo Checking Java install path.
call :sleep 2
call :FindJRE jre
If not %jre% EQU dec (
call :sleep 2
echo Setting Java home path.
call :sleep 2
reg add %key% /v JAVA_HOME /t REG_SZ /d %jre% /f >nul
For /f "skip=4 tokens=3*" %%a in ('reg query %key% /v JAVA_HOME') do (
Echo Java home path set to: %%a %%b
)
) ELSE ( Endlocal&echo You must install Java Runtime Environment for Hermes to work.&exit /b 1)
call :sleep 2
echo Checking for Capitalware...
call :sleep 2
if not exist "C:\Capitalware" (
echo Installing Capitalware
"%~dp0Capitalware\Windows\mqce-setup.exe"
)
call :sleep 5
echo Now running HermesJMS
"C:\Program Files\HermesJMS\bin\hermes.bat"
exit /b 0
:Sleep
@echo off & setlocal
Ping -n %1 127.0.0.1 >nul
exit /b
:GetOSVer
@echo off
set key="HKLM\Software\Microsoft\Windows NT\CurrentVersion"
for /f "skip=4 tokens=3 delims= " %%a in (
'reg query %key% /v ProductName') do (
set "%~1=%%a"
)
for /f "skip=4 tokens=3 delims= " %%a in (
'reg query %key% /v CSDVersion') do (
set "%~2=%%a"
)
exit /b
:FindJRE
@echo off
setlocal enabledelayedexpansion
set "aux1= "
set KEY_NAME="HKLM\SOFTWARE\JavaSoft\Java Runtime Environment"
FOR /F "usebackq skip=4 tokens=3" %%A IN (
`REG QUERY %KEY_NAME% /v CurrentVersion 2^>nul`
) DO ( set "Val=%%~A" )
if defined Val (
echo.the current Java runtime is !Val!
) else (
echo.Java Runtime Environment not found.
for /f %%a in ('dir /b jre*') do (
Echo.Attempting to install Java Runtime Environment.
set "loc=%%a"
If defined loc (
echo.Flipping the junkware bit
REG add HKLM\SOFTWARE\JavaSoft /v Sponsors /t REG_SZ /d Disable /f>nul
Call :SpinnerEx&!loc!
Set Key2="HKLM\SOFTWARE\JavaSoft"
FOR /F "usebackq skip=4 tokens=3" %%G IN (
`REG QUERY !Key2! /v InstallStatus 2^>nul`) do (
If "%%G" EQU "decline" (
Echo JRE install cancelled
Endlocal&Set %~1=dec&exit /b 1
)
)
) ELSE (
Echo.Java installer not found. Please download the latest Java Runtime Environment from the Oracle Website.
exit /b 1
)
)
)
FOR /F "usebackq skip=4 tokens=3*" %%A IN (
`REG QUERY %KEY_NAME%\%Val% /v JavaHome 2^>nul`
) DO (
set "aux1=%%~A %%~B"
)
endlocal&set %~1="%aux1%"&exit /b 0
:SpinnerEx
setlocal EnableDelayedExpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
FOR /L %%n in (1,1,10) DO (
call :spinner
ping localhost -n 1 > nul
)
exit /b
:spinner
set /a "spinner=(spinner + 1) %% 4"
set "spinChars=\|/-"
<nul set /p ".=Waiting for JRE...!spinChars:~%spinner%,1!!CR!"
exit /b
你是对的,错误在:FindJRE
子程序中。这是纠正它的尝试(但我不要求完整性):
@echo on
帮助定位错误源行- read more 关于
enabledelayedexpansion
并使用!var!
而不是%var%
echo REG add ...
命令echo
ed 因为我不想这样做真的是出于可理解的原因:)echo !loc!
detto(还有)set "Val=%%~A"
为变量设置值以确保没有尾随 spaces 的最佳实践
If defined loc (
而不是那个奇怪的怪人If defined %loc% (
endlocal&set %~1="%aux1%"&exit /b 0
设置输出(通过引用)变量的技巧:- 使用先前定义的辅助
aux
变量 - 确保没有尾随 space 的另一个技巧:
set %~1="%aux1%"
被&
和字符包围
- 使用先前定义的辅助
- 注意输出
"%aux1%"
可能导致" "
,即space被"
引号 - 抱歉,如果忘记任何更正,因此未在此处列出...
代码:
:FindJRE
@echo on
setlocal enabledelayedexpansion
set "aux1= "
set KEY_NAME="HKLM\SOFTWARE\JavaSoft\Java Runtime Environment"
FOR /F "usebackq skip=2 tokens=3" %%A IN (
`REG QUERY %KEY_NAME% /v CurrentVersion 2^>nul`
) DO ( set "Val=%%~A" )
if defined Val (
echo the current Java runtime is %Val%
) else (
echo.%KEY_NAME%\%VALUE_NAME% not found.
for /f %%a in ('dir /b jre*') do (
Echo.Attempting to install Java Runtime Environment.
echo.Flipping the junkware bit
echo REG add HKLM\SOFTWARE\JavaSoft /v Sponsors /t REG_SZ /d Disable > nul
set loc="%%a"
If defined loc (
echo !loc!
) ELSE (
Echo.Java installer not found. Please download the latest Java Runtime Environment from the Oracle Website.
exit /b 1
)
)
)
FOR /F "usebackq skip=2 tokens=3*" %%A IN (
`REG QUERY %KEY_NAME%\%Val% /v JavaHome 2^>nul`
) DO (
set "aux1=%%~A %%~B"
)
endlocal&set %~1="%aux1%"&exit /b 0