Batch file 查找已安装的JRE版本,如果找不到,请安装它
我正在开发一个子例程,它检查注册表中的Java运行时路径,如果找不到,则尝试安装它。我的代码中有一个错误,但我盯着它看了太久,找不到它。运行时得到的输出是:Batch file 查找已安装的JRE版本,如果找不到,请安装它,batch-file,Batch File,我正在开发一个子例程,它检查注册表中的Java运行时路径,如果找不到,则尝试安装它。我的代码中有一个错误,但我盯着它看了太久,找不到它。运行时得到的输出是: Running Microsoft Windows XP Service Pack 3 Installing HermesJMS. Checking Java Runtime install path. The syntax of the command is incorrect. 我很确定错误在:FindJRE子例程中。非常感谢您的帮助
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
::HermesJMS安装脚本:
::作者-马特·威廉姆森:
::修订版1-2015年2月13日:
::::::::::::::::::::::::::::::
@回音
setlocal
调用:GetOSVer os sp
回显正在运行%os%%sp%
电话:睡眠2
set key=“HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment”
ECHO安装hermes。
电话:睡眠2
hermes-installer-1.14.jar
echo检查Java安装路径。
电话:睡眠2
电话:FindJRE jre
如果不是%jre%EQU dec(
电话:睡眠2
回显设置Java主路径。
电话:睡眠2
reg add%key%/v JAVA_HOME/t reg_SZ/d%jre%/f>nul
对于/f“skip=4 tokens=3*”%%a in('reg query%key%/v JAVA_HOME')do(
回显Java主路径设置为:%%a%%b
)
)ELSE(Endlocal&echo您必须安装Java运行时环境,Hermes才能工作。&退出/b 1)
电话:睡眠2
回显检查Capitalware。。。
电话:睡眠2
如果不存在“C:\Capitalware”(
echo安装软件
“%~dp0Capitalware\Windows\mqce setup.exe”
)
电话:睡眠5
echo现在正在运行HermesJMS
“C:\Program Files\HermesJMS\bin\hermes.bat”
退出/b0
:睡觉
@echo off和setlocal
Ping-n%1127.0.0.1>nul
退出/b
:GetOSVer
@回音
set key=“HKLM\Software\Microsoft\Windows NT\CurrentVersion”
对于/f“跳过=4个令牌=3个delims=”%a in(
“注册查询%key%/v ProductName”)是否执行(
设置“%~1=%%a”
)
对于/f“跳过=4个令牌=3个delims=”%a in(
“注册查询%key%/v CSDVersion”)执行(
设置“%~2=%%a”
)
退出/b
:FindJRE
@回音
延迟扩展
设置“aux1=”
set KEY\u NAME=“HKLM\SOFTWARE\JavaSoft\Java运行时环境”
对于/F“usebackq skip=4个令牌=3”%%A(
`注册查询%KEY\u NAME%/v当前版本2^>nul`
)DO(设置“Val=%%~A”)
如果定义Val(
当前的Java运行时是!Val!
)其他(
未找到echo.Java运行时环境。
对于('dir/b jre*)中的/f%%a,请执行以下操作(
正在尝试安装Java运行时环境。
设置“loc=%%a”
如果定义loc(
埃科,把垃圾桶翻过来
REG add HKLM\SOFTWARE\JavaSoft/v赞助商/t REG_SZ/d Disable/f>nul
呼叫:SpinnerEx&!loc!
Set Key2=“HKLM\SOFTWARE\JavaSoft”
对于/F“usebackq skip=4令牌=3”%%G IN(
`REG QUERY!Key2!/v InstallStatus 2^>nul`)do(
如果“%%G”等于“下降”(
Echo JRE安装已取消
Endlocal&Set%~1=dec&exit/b 1
)
)
)否则(
未找到Echo.Java安装程序。请从Oracle网站下载最新的Java运行时环境。
退出/b 1
)
)
)
对于/F“usebackq skip=4令牌=3*”%%A(
`注册查询%KEY\u NAME%\%Val%/v JavaHome 2^>nul`
)做(
设置“aux1=%%~A%%~B”
)
endlocal&set%~1=“%aux1%”和退出/b 0
:喷丝头
setlocal EnableDelayedExpansion
对于('copy/Z'%~dpf0“nul')中的/f%%a,请设置“CR=%%a”
对于(1,1,10)DO中的/L%%n(
呼叫:微调器
ping localhost-n 1>nul
)
退出/b
:旋转器
设置/a“微调器=(微调器+1)%%4”
设置“spinChars=\\\;/-”
您是对的,错误在:FindJRE
子例程中。下面是一个纠正它的尝试(但我不主张完整性):
@echo on
帮助定位错误源行
- 关于
启用延迟扩展和使用!瓦尔代码>而不是%var%
echo REG add…
commandecho
ed,因为我不想这样做,这是出于可以理解的原因:)
- 回声!loc代码>详细信息(以及)
set“Val=%%~A”
为变量设置值以确保没有尾随空格的最佳实践
如果定义了loc(
而不是奇怪的如果定义了%loc%(
endlocal&set%~1=“%aux1%”和exit/b0
设置输出(通过引用)变量的技巧:
- 使用先前定义的辅助
aux
变量
- 另一个确保没有尾随空格的技巧是:
set%~1=“%aux1%”
被&
符号和字符包围
- 注意输出
“%aux1%”
可能导致“
”,即用“
引号包围的空间
- 抱歉,如果忘记了任何更正,因此未在此处列出
守则:
: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
如果您打开echo,错误会发生在哪里?忘记了echo。当前Java运行时是%Val%
,应该是!Val!
我刚从您的代码中获取了它,但奇怪的是,它在没有延迟扩展的情况下工作了!现在,这会让我在试图弄清楚如何运行时遇到问题。很好,所有的事情我都忘记了,因为我没有写过n批处理脚本超过一年。我已经用完全可用的版本更新了我的原始帖子。