1

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

例如,在运行命令的简化版本时:

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

运行独立脚本时,会打印出注册表值,但是当调用相同的文件时(它没有编译到安装程序中,而是通过运行时调用),上面的相同命令什么也不返回。

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

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

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

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

从安装程序安装程序运行时的打印输出中,我可以看到脚本正在运行,这是最新版本,但打印输出看起来不同(查询命令不返回任何内容)。我检查了注册表查询之前和之后的错误级别是否保持不变。

我在我自己的 Windows 10 (x64) 机器上看不到这个问题,但我在 Virtualbox Windows 10 (x64) 机器上看到它。

4

1 回答 1

1

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

并且通常还建议了解有关在 Windows 上注册应用程序的知识。

这是获取当前 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

我将只使用Path从根本上查询HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\javaws.exe或什至更好地使用此注册表项的默认值的解决方案,java.exe如果存在则运行以获取其版本。但是没有描述真正需要哪个 Java 版本以及应该为哪个版本的 Windows 编写这个批处理文件。我添加了额外的代码,也可以在 Windows XP 和 Windows Server 2003 上工作(未经测试)。Windows XP 和 Windows Server 2003 上的 REG 输出的信息与Windows Vista/Server 2008 和更高版本的 Windows 版本上的 REG 不同,如阅读用空格分隔的单词和字符串值的答案代码中的注释中所解释的那样,批处理脚本中也包含空格

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

  • 回声/?
  • 本地/?
  • 为了 /?
  • 去 /?
  • 如果 /?
  • 注册/?
  • 注册查询 /?
  • 雷姆/?
  • 放 /?
  • 设置本地/?
于 2018-07-26T14:07:05.473 回答