Получить все результаты цикла for в пакете (%% a %% b %% c ... %% z) - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь получить путь к ключу реестра JavaHome, и пока у меня есть это:

for /f "skip=2 tokens=3" %%x in ('reg query "HKLM\SOFTWARE\JavaSoft\%~1" /v CurrentVersion') do set JavaTemp=%%x

for /f "skip=2 tokens=3*" %%a in ('reg query "HKLM\SOFTWARE\JavaSoft\%~1\%JavaTemp%" /v JavaHome') do set JAVA_HOME=%%a %%b
echo %JAVA_HOME%

Примечание:% 1 может быть "JRE" или "JDK"

Ссылка: http://www.rgagnon.com/javadetails/java-0642.html

Однако при этом получаются только первые две части пути (%% a %% b), разделенные пробелами.Если в пути более одного пробела, он не сможет вывести весь путь.

Я не слишком разбираюсь в циклах for в Batch, поэтому мой вопрос: как мне получитьвсе токены найдены?(без необходимости делать %% a %% b ... %% z) Могу ли я как-нибудь использовать вложенный цикл for?

Сначала я думал, что могу просто сделать

set JAVA_HOME=%%*

Но это не работает.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018
@echo off
setlocal

set "Arg1=%~1"

if not defined Arg1 (
    >&2 echo No argument passed for Arg1
    exit /b 1
)

for /f "tokens=1,2*" %%A in (
    '2^>nul reg query "HKLM\SOFTWARE\JavaSoft\%Arg1%" /v CurrentVersion'
) do if /i "%%~A" == "CurrentVersion" set "JavaTemp=%%~C"

if not defined JavaTemp (
    >&2 echo JavaTemp undefined
    exit /b 2
)

for /f "tokens=1,2*" %%A in (
    '2^>nul reg query "HKLM\SOFTWARE\JavaSoft\%Arg1%\%JavaTemp%" /v JavaHome'
) do if /i "%%~A" == "JavaHome" set "JAVA_HOME=%%~C"

if not defined JAVA_HOME (
    >&2 echo JAVA_HOME undefined
    exit /b 3
) else echo %JAVA_HOME%

exit /b 0

Выдержка из for /?:

Если последний символ в строке токенов = является звездочкой, то дополнительная переменная выделяется и получает оставшийся текст в строке после последнего проанализированного токена.

Опции токена 1,2*:

  • 1 получает слово, представляющее значение реестра, т.е. %%A ==JavaHome.
  • 2 получает слово, представляющее тип реестра, т.е. %%B == REG_SZ.
  • * получает оставшийся текст т.е.Параметр %%C == C:\Program Files\Java\jre1.6.0_06

Нет skip, используемый в качестве ссылки из HowTo в вопросе Real, показывает целочисленную вариацию с WinXP и Win7.Проверка значения 1-го токена определяет используемую строку, которая может быть общей для WinXP, Win7 и более поздних версий.

Для этой задачи не требуется вложенный цикл for.

0 голосов
/ 31 мая 2018

Не могли бы вы просто использовать опцию Reg Query /S для рекурсивного запроса всех подразделов и значений, а затем включить опцию /V, чтобы возвращать данные, соответствующие только имени указанного значения:

Пример:

@Echo Off
Set "_K=HKLM\SOFTWARE\JavaSoft"
Set "_V=JavaHome"
Set "_D="
For /F "Tokens=2*" %%A In (
    '"Reg Query "%_K%" /S /V "%_V%" 2>Nul|Find "REG_""') Do Set "_D=%%~B"
If Defined _D Echo %_D% & Pause

Вы можете заменить _D на JAVA_HOME при необходимости

...