Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 查找已安装的JRE版本,如果找不到,请安装它_Batch File - Fatal编程技术网

Batch file 查找已安装的JRE版本,如果找不到,请安装它

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子例程中。非常感谢您的帮助

我正在开发一个子例程,它检查注册表中的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                 
::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…
    command
    echo
    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批处理脚本超过一年。我已经用完全可用的版本更新了我的原始帖子。