Невозможно определить версию Java при запуске команды .bat из установщика Qt.

Я хотел бы определить, была ли установлена ​​​​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).


person Willeman    schedule 26.07.2018    source источник
comment
Почему бы не сделать системный вызов java.exe -version вместо запроса к реестру? Также вы можете попробовать сделать то же самое без использования пакетного файла. Попробуйте сделать системный вызов for /f "tokens=*" %j in ('reg query "HKLM\SOFTWARE\JavaSoft\Java Runtime Environment"') do ( echo %j )   -  person Julio    schedule 26.07.2018


Ответы (1)


Я полагаю, что установщик Qt - это 32-битное приложение. Поэтому запускается 32-разрядная версия cmd.exe, которая работает под управлением 32-разрядной reg.exe в 64-разрядной версии Windows. Итак, необходимо иметь знания о:

А также желательно в целом иметь знания о регистрации приложений в 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 (не тестировался). REG в Windows XP и Windows Server 2003 выводит информацию, отличную от REG в Windows Vista/Server 2008 и более поздних версиях Windows, что объясняется комментариями в коде ответа на Чтение слов, разделенных пробелом, и строковое значение также содержит пробел в пакетном скрипте.

Чтобы понять, какие команды используются и как они работают, откройте окно командной строки, выполните в нем следующие команды и внимательно прочитайте все страницы справки, отображаемые для каждой команды.

  • эхо /?
  • эндлокальный /?
  • за /?
  • перейти к /?
  • if /?
  • рег /?
  • рег запрос /?
  • рем /?
  • установлен /?
  • установить локальный /?
person Mofi    schedule 26.07.2018