当 Qt 安装程序中的 运行.bat 命令时无法确定 java 版本

Unabled to determine java version when running .bat command from within Qt installer

我想检测机器上是否安装了 java,如果安装了,是哪个 JRE 版本。我有一个简单的 .bat 文件脚本 运行s 并查询注册表。当 运行 单独使用时,这可以正常工作,但是当 运行 在 Qt 安装程序中使用相同的命令 returns 时,没有键值对。我有点难过。我曾尝试在执行命令时提升安装程序,但坦率地说,当 运行ning 没有来自命令的权限时脚本成功,并且它也没有任何区别。

例如,当运行使用命令的简化版本时:

for /f "tokens=*" %%j in (
   'reg query "HKLM\SOFTWARE\JavaSoft\Java Runtime Environment"'
) do ( echo %%j )

当 运行 运行独立脚本时,注册表值被打印出来,但是当调用同一个文件时(它没有编译到安装程序中,而是通过 运行-time 调用)相同上面的命令 returns 什么都没有。

我正在使用 Qt 安装程序框架 3.0.5。

脚本位于:com.domain.packagex\meta\myscript.bat

并从包组件qs脚本中调用:

var returnArray = 
installer.execute(".\packages\com.domain.packagex\meta\myscript.bat");
...

从安装程序安装程序 运行 时的打印输出中,我可以看到脚本正在 运行,这是最新版本,但打印输出看起来不同(查询命令 returns没有什么)。我已经检查过注册表查询前后错误级别保持不变。

我在自己的 Windows 10 (x64) 机器上没有看到这个问题,但我在 Virtualbox Windows 10 (x64) 机器上看到了它..

我想 Qt 安装程序是一个 32 位应用程序。因此 32 位 cmd.exe 启动,它在 64 位 Windows 上运行 32 位 reg.exe。所以有必要了解:

一般来说,在 Windows 上了解 application registration 也是明智的。

这是获取 Java 当前版本的快速编码解决方案:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem Use reg.exe in Windows system directory on 32-bit Windows
rem and on 64-bit Windows on being executed in 64-bit environment.
set "RegExe=%SystemRoot%\System32\reg.exe"

rem But on 64-bit Windows with running this batch file in 32-bit environment,
rem use system redirector Sysnative to run also 64-bit REG in the directory
rem %SystemRoot%\System32 instead of 32-bit REG in %SystemRoot%\SysWOW64.
if exist %SystemRoot%\Sysnative\reg.exe set "RegExe=%SystemRoot%\Sysnative\reg.exe"

rem First query the version of 64-bit Java on 64-bit Windows
rem respectively version of 32-bit Java on 32-bit Windows.
for /F "skip=2 tokens=1,2*" %%A in ('%RegExe% query "HKLM\SOFTWARE\JavaSoft\Java Runtime Environment" /v CurrentVersion 2^>nul') do if /I "%%A" == "CurrentVersion" set "JavaVersion=%%C" & goto HaveJavaVersion

rem Java version not found. On 64-bit Windows query version of 32-bit Java.
if not "%ProgramFiles(x86)%" == "" for /F "skip=2 tokens=1,2*" %%A in ('%RegExe% query "HKLM\SOFTWARE\Wow6432Node\JavaSoft\Java Runtime Environment" /v CurrentVersion 2^>nul') do if /I "%%A" == "CurrentVersion" set "JavaVersion=%%C" & goto HaveJavaVersion

rem Is Java installed and registered at all?
for /F "skip=2 tokens=1,2*" %%A in ('%RegExe% query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\javaws.exe" /v Path 2^>nul') do if /I "%%A" == "Path" set "JavaPath=%%C" & goto HaveJavaPath
goto JavaNotInstalled

:HaveJavaPath
if not exist "%JavaPath%\java.exe" goto JavaNotInstalled
rem Java prints version information to STDERR instead of STDOUT. For that
rem reason 2>&1 is necessary to redirect the output to STDOUT for being
rem captured by FOR from background command process started with cmd /C
rem by FOR for executing the command line within the round brackets.
for /F "tokens=2*" %%A in ('"%JavaPath%\java.exe" -version 2^>^&1') do if /I "%%A" == "version" set "JavaVersion=%%~B" & goto HaveJavaVersion

:JavaNotInstalled
echo Java is not installed.
goto EndBatch

:HaveJavaVersion
echo Current version of Java is: %JavaVersion%

:EndBatch
endlocal

我只会使用从 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\javaws.exe 查询 Path 的解决方案,甚至更好地使用此注册表项的默认值,如果存在,则 运行 java.exe得到它的版本。但是没有描述真正需要哪个 Java 版本以及应该为哪个 Windows 版本编写这个批处理文件。我添加了额外的代码以在 Windows XP 和 Windows Server 2003(未测试)上工作。 REG on Windows XP 和 Windows Server 2003 输出的信息不同于 REG on Windows Vista/Server 2008 及更高版本 Windows 版本,如 .

的答案代码中的注释所解释

要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • 回声/?
  • endlocal/?
  • 对于/?
  • 转到/?
  • 如果/?
  • 注册/?
  • reg查询/?
  • rem/?
  • 设置/?
  • 设置本地/?