如何确定32BIT的位置Java
How to determine location of 32BIT Java
有些时候 JRE 安装在特定版本的目录中 [1]。
所以我尝试写一个DOS批处理或者VBS脚本来确定最新安装的JRE 8 32位的位置。
但是在检查注册表项时
"HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft"
我注意到这仅包含有关 64 位 Java 运行时的信息。
那么知道如何通过 DOS 或 vbs 确定最新安装的 32 位 Java 运行时的位置吗?这还应该考虑到系统上可能会并行安装 64 位版本。
另一种方法是在目录 C:\Program Files (x86)\Java 中搜索文件。但是 Java Runtime 可能没有安装在这个目录中。
[1] http://www.oracle.com/technetwork/java/javase/8u20-relnotes-2257729.html
JRE 安装目录
从 JDK 8u20 版本开始,JRE 将安装在特定版本的目录中。例如:
C:\程序Files\Java\jre1.8.0_20
特定于版本的目录命名是有意的,并不表示 JRE 安装是静态的。
与早期版本一样,静态 JRE 安装仅在用户传递 STATIC=1 选项(通过命令行或配置文件)时执行。
编辑: 是正确的。请参阅我对他的回答的补充。
上一个回答:从开始菜单快捷方式抓取位置怎么样?该快捷方式应始终位于“所有用户”“开始”菜单 →“程序”中,除非用户手动删除它,在将近二十年的桌面支持中,我不能说我从未见过这种情况。快捷方式应始终指向 Java 的默认实例,即使安装了多个版本。安装程序没有让最终用户放弃创建开始菜单快捷方式的选项。
无论如何,wmic path win32_shortcutfile
可以读取快捷方式的目标。
如下所述,“开始”菜单快捷方式可能指向 Java 的 64 位安装。如果是这种情况,则返回搜索 %PROGRAMFILES(x86)%
寻找 java.exe
.
@echo off
setlocal
set "lnk=%PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\Java\About Java.lnk"
if defined PROGRAMFILES(x86) (set "PF=%PROGRAMFILES(x86)%") else set "PF=%PROGRAMFILES%"
for /f "tokens=1* delims==" %%I in (
'wmic path win32_shortcutfile where "name='%lnk:\=\%'" get target /format:list 2^>NUL ^| find "="'
) do set "$JAVA=%%~dpJ"
if not defined $JAVA goto notfound
2>&1 "%$JAVA%\java.exe" -version | find /i "64-bit" >NUL && (
(
for /f "delims=" %%I in ('dir /s /b /o:n "%PF%\*java.exe" 2^>NUL') do set "$JAVA=%%~dpI"
) || (
goto notfound
)
)
echo Latest 32-bit Java lives in %$JAVA%
goto :EOF
:notfound
echo Please install 32-bit Java.
goto :EOF
我发现 64 位 Java 运行时安装不会覆盖 32 位版本的注册表项。如果您使用 regedit.exe 的 32 位版本,您会发现属于 32 位 Java 运行时环境安装的注册表项。
所以下面的批处理文件应该可以解决上面的问题:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@ECHO OFF
:: Execution on a 64 BIT system?
if defined PROGRAMFILES(x86) (set "REGEDITLOC=%windir%\SysWOW64\") else set "REGEDITLOC="
:: Define local parameters
set "TEMP_FILE_JAVA_REGISTRY_CONTENT=%~dp0java_runtime_environment.reg"
:: Export java Runtime Keys from registry to a temporary file
START /W %REGEDITLOC%REGEDIT /E "%TEMP_FILE_JAVA_REGISTRY_CONTENT%" "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment"
:: Determine the install directory of java
FOR /F "tokens=1* delims==" %%A IN ('TYPE "%TEMP_FILE_JAVA_REGISTRY_CONTENT%" ^| FIND "JavaHome"') DO SET JAVA_RUNTIME_HOME=%%B
:: Remove not required chars
SET JAVA_RUNTIME_HOME=%JAVA_RUNTIME_HOME:"=%
SET JAVA_RUNTIME_HOME=%JAVA_RUNTIME_HOME:\=\%
@echo %JAVA_RUNTIME_HOME%
:: Delete temp file
@del "%TEMP_FILE_JAVA_REGISTRY_CONTENT%" /S /Q > NUL 2>&1
@ECHO ON
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
来自 rojo 的贡献:
上面的脚本说明了正确的想法,但是导出 .reg 文件并抓取它可能有点麻烦。这是相同的想法,但使用 %windir%\syswow64\reg.exe query
在线查询注册表值:
@ECHO OFF
setlocal
if defined PROGRAMFILES(x86) (set "reg=%windir%\SysWOW64\reg") else set "reg=reg"
set "branch=HKLM\Software\JavaSoft\Java Runtime Environment"
for /f "tokens=3" %%v in ('%reg% query "%branch%" /v "CurrentVersion" ^| find "REG_SZ"') do (
for /f "tokens=2*" %%I in ('%reg% query "%branch%\%%v" /v "JavaHome" ^| find "REG_SZ"') do (
set "$JAVA=%%J"
)
)
echo Location of java.exe: %$JAVA%\bin
有些时候 JRE 安装在特定版本的目录中 [1]。
所以我尝试写一个DOS批处理或者VBS脚本来确定最新安装的JRE 8 32位的位置。
但是在检查注册表项时 "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft" 我注意到这仅包含有关 64 位 Java 运行时的信息。
那么知道如何通过 DOS 或 vbs 确定最新安装的 32 位 Java 运行时的位置吗?这还应该考虑到系统上可能会并行安装 64 位版本。
另一种方法是在目录 C:\Program Files (x86)\Java 中搜索文件。但是 Java Runtime 可能没有安装在这个目录中。
[1] http://www.oracle.com/technetwork/java/javase/8u20-relnotes-2257729.html
JRE 安装目录 从 JDK 8u20 版本开始,JRE 将安装在特定版本的目录中。例如: C:\程序Files\Java\jre1.8.0_20
特定于版本的目录命名是有意的,并不表示 JRE 安装是静态的。 与早期版本一样,静态 JRE 安装仅在用户传递 STATIC=1 选项(通过命令行或配置文件)时执行。
编辑:
上一个回答:从开始菜单快捷方式抓取位置怎么样?该快捷方式应始终位于“所有用户”“开始”菜单 →“程序”中,除非用户手动删除它,在将近二十年的桌面支持中,我不能说我从未见过这种情况。快捷方式应始终指向 Java 的默认实例,即使安装了多个版本。安装程序没有让最终用户放弃创建开始菜单快捷方式的选项。
无论如何,wmic path win32_shortcutfile
可以读取快捷方式的目标。
如下所述,“开始”菜单快捷方式可能指向 Java 的 64 位安装。如果是这种情况,则返回搜索 %PROGRAMFILES(x86)%
寻找 java.exe
.
@echo off
setlocal
set "lnk=%PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\Java\About Java.lnk"
if defined PROGRAMFILES(x86) (set "PF=%PROGRAMFILES(x86)%") else set "PF=%PROGRAMFILES%"
for /f "tokens=1* delims==" %%I in (
'wmic path win32_shortcutfile where "name='%lnk:\=\%'" get target /format:list 2^>NUL ^| find "="'
) do set "$JAVA=%%~dpJ"
if not defined $JAVA goto notfound
2>&1 "%$JAVA%\java.exe" -version | find /i "64-bit" >NUL && (
(
for /f "delims=" %%I in ('dir /s /b /o:n "%PF%\*java.exe" 2^>NUL') do set "$JAVA=%%~dpI"
) || (
goto notfound
)
)
echo Latest 32-bit Java lives in %$JAVA%
goto :EOF
:notfound
echo Please install 32-bit Java.
goto :EOF
我发现 64 位 Java 运行时安装不会覆盖 32 位版本的注册表项。如果您使用 regedit.exe 的 32 位版本,您会发现属于 32 位 Java 运行时环境安装的注册表项。
所以下面的批处理文件应该可以解决上面的问题:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@ECHO OFF
:: Execution on a 64 BIT system?
if defined PROGRAMFILES(x86) (set "REGEDITLOC=%windir%\SysWOW64\") else set "REGEDITLOC="
:: Define local parameters
set "TEMP_FILE_JAVA_REGISTRY_CONTENT=%~dp0java_runtime_environment.reg"
:: Export java Runtime Keys from registry to a temporary file
START /W %REGEDITLOC%REGEDIT /E "%TEMP_FILE_JAVA_REGISTRY_CONTENT%" "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment"
:: Determine the install directory of java
FOR /F "tokens=1* delims==" %%A IN ('TYPE "%TEMP_FILE_JAVA_REGISTRY_CONTENT%" ^| FIND "JavaHome"') DO SET JAVA_RUNTIME_HOME=%%B
:: Remove not required chars
SET JAVA_RUNTIME_HOME=%JAVA_RUNTIME_HOME:"=%
SET JAVA_RUNTIME_HOME=%JAVA_RUNTIME_HOME:\=\%
@echo %JAVA_RUNTIME_HOME%
:: Delete temp file
@del "%TEMP_FILE_JAVA_REGISTRY_CONTENT%" /S /Q > NUL 2>&1
@ECHO ON
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
来自 rojo 的贡献:
上面的脚本说明了正确的想法,但是导出 .reg 文件并抓取它可能有点麻烦。这是相同的想法,但使用 %windir%\syswow64\reg.exe query
在线查询注册表值:
@ECHO OFF
setlocal
if defined PROGRAMFILES(x86) (set "reg=%windir%\SysWOW64\reg") else set "reg=reg"
set "branch=HKLM\Software\JavaSoft\Java Runtime Environment"
for /f "tokens=3" %%v in ('%reg% query "%branch%" /v "CurrentVersion" ^| find "REG_SZ"') do (
for /f "tokens=2*" %%I in ('%reg% query "%branch%\%%v" /v "JavaHome" ^| find "REG_SZ"') do (
set "$JAVA=%%J"
)
)
echo Location of java.exe: %$JAVA%\bin