在Windows bat文件中找到JRE安装以运行java程序的可靠方法

在Windows bat文件中找到JRE安装以运行java程序的可靠方法,java,batch-file,window,Java,Batch File,Window,在Windows上安装最新的JRE 7时,它不再向系统路径添加命令java。因此,在这种情况下,仅在bat文件中调用java--version将失败(尽管安装了java.com中的java) 在windows bat文件中查找java命令安装目录的可靠方法是什么? 我在以下地点看到过: C:\ProgramFiles\Java\jre6\bin\Java.exe C:\ProgramFiles\Java\jre7\bin\Java.exe C:\ProgramFiles(x86)\Java\j

在Windows上安装最新的JRE 7时,它不再向系统路径添加命令
java
。因此,在这种情况下,仅在bat文件中调用
java--version
将失败(尽管安装了java.com中的java)

在windows bat文件中查找java命令安装目录的可靠方法是什么?

我在以下地点看到过:

  • C:\ProgramFiles\Java\jre6\bin\Java.exe
  • C:\ProgramFiles\Java\jre7\bin\Java.exe
  • C:\ProgramFiles(x86)\Java\jre7\bin\Java.exe
  • 还没有试过JRE 8

注意:如果有多个,我想要默认值(或最新的-我不在乎)。

这是如何找到它们的

Dir c:\java.exe /a/s 
搜索整个驱动器

你可以把它放在一个for循环中。(在
for
循环中
%A
成为批处理中的
%A

这会找到它,并将日、月、年放入不同的变量中

For /?
dir /?
findstr /?

这就是如何找到它们

Dir c:\java.exe /a/s 
搜索整个驱动器

你可以把它放在一个for循环中。(在
for
循环中
%A
成为批处理中的
%A

这会找到它,并将日、月、年放入不同的变量中

For /?
dir /?
findstr /?

如果已安装,请询问windows它在哪里

@echo off 
    setlocal enableextensions disabledelayedexpansion

    rem Where to find java information in registry
    set "javaKey=HKLM\SOFTWARE\JavaSoft\Java Runtime Environment"

    rem Get current java version
    set "javaVersion="
    for /f "tokens=3" %%v in ('reg query "%javaKey%" /v "CurrentVersion" 2^>nul') do set "javaVersion=%%v"

    rem Test if a java version has been found
    if not defined javaVersion (
        echo Java version not found
        goto endProcess
    )

    rem Get java home for current java version
    set "javaDir="
    for /f "tokens=2,*" %%d in ('reg query "%javaKey%\%javaVersion%" /v "JavaHome" 2^>nul') do set "javaDir=%%e"

    if not defined javaDir (
        echo Java directory not found
    ) else (
        echo JAVA_HOME : %javaDir%
    )

:endProcess 
    endlocal

如果已安装,请询问windows它在哪里

@echo off 
    setlocal enableextensions disabledelayedexpansion

    rem Where to find java information in registry
    set "javaKey=HKLM\SOFTWARE\JavaSoft\Java Runtime Environment"

    rem Get current java version
    set "javaVersion="
    for /f "tokens=3" %%v in ('reg query "%javaKey%" /v "CurrentVersion" 2^>nul') do set "javaVersion=%%v"

    rem Test if a java version has been found
    if not defined javaVersion (
        echo Java version not found
        goto endProcess
    )

    rem Get java home for current java version
    set "javaDir="
    for /f "tokens=2,*" %%d in ('reg query "%javaKey%\%javaVersion%" /v "JavaHome" 2^>nul') do set "javaDir=%%e"

    if not defined javaDir (
        echo Java directory not found
    ) else (
        echo JAVA_HOME : %javaDir%
    )

:endProcess 
    endlocal

请看这里,有一个批处理脚本:请看这里,有一个批处理脚本:
setlocal enableextensions disabledelayedexpansion
做什么?是否需要它?@GeoffreyDeSmet,
setlocal
保护环境变量不受
setlocal/endlocal
内部所做更改的影响,
enableextensions
通常不需要,因为默认情况下会启用扩展,但这只是一个确保不会出现问题的好习惯<代码>disabledelayedexpansion的加入只是为了防止在将值分配给变量时出现一些解析器错误,当值包含感叹号(将被解析/解释/删除)时,我在1台Windows机器(win 8)上用最新的java.com(1.7)尝试了这一点,注册表项不是
HKLM\SOFTWARE\JavaSoft\Java运行时环境
,而是
HKLM\SOFTWARE\Wow6432Node\JavaSoft\Java运行时环境
。是否有任何方法可以处理所有这些偏差?显然,Wow6432Node是唯一常见的偏差,因此对该regkey进行额外检查可以解决这个问题。谢谢:)(这是基于这个答案。)
setLocalEnableExtensions-disabledelayedexpansion
做什么?是否需要它?@GeoffreyDeSmet,
setlocal
保护环境变量不受
setlocal/endlocal
内部所做更改的影响,
enableextensions
通常不需要,因为默认情况下会启用扩展,但这只是一个确保不会出现问题的好习惯<代码>disabledelayedexpansion的加入只是为了防止在将值分配给变量时出现一些解析器错误,当值包含感叹号(将被解析/解释/删除)时,我在1台Windows机器(win 8)上用最新的java.com(1.7)尝试了这一点,注册表项不是
HKLM\SOFTWARE\JavaSoft\Java运行时环境
,而是
HKLM\SOFTWARE\Wow6432Node\JavaSoft\Java运行时环境
。是否有任何方法可以处理所有这些偏差?显然,Wow6432Node是唯一常见的偏差,因此对该regkey进行额外检查可以解决这个问题。谢谢:)(基于这个答案)。