批量获取 for 循环的所有结果 (%%a %%b %%c ... %%z)

Get all results from for loop in batch (%%a %%b %%c ... %%z)

我正在尝试获取 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) 被白色分割space。如果路径中有多个space,则无法输出完整路径。

我对 Batch 中的 for 循环不太熟悉,所以我的问题是:我怎样才能找到所有的标记? (无需执行 %%a %%b ... %%z) 我能以某种方式使用嵌套 for 循环吗?

我最初的想法是我可以做到

set JAVA_HOME=%%*

但这行不通。

你能不能只使用Reg Query /S 选项递归查询所有子键和值,然后将 /V 选项包含到 return 仅匹配特定数据的数据值名称:

示例:

@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

@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 /?

If the last character in the tokens= string is an asterisk, then an additional variable is allocated and receives the remaining text on the line after the last token parsed.

代币选项1,2*:

  • 1 获取表示注册表值的单词,即 %%A == JavaHome.
  • 2 获取表示注册表类型的词,即 %%B == REG_SZ.
  • * 获取 剩余文本 %%C == C:\Program Files\Java\jre1.6.0_06

没有 skip 选项用作问题中 Real's HowTo 的 link 显示 WinXP 和 Win7 的整数变体。 检查第一个标记值决定使用哪一行 WinXP、Win7 及更高版本通用。

此任务不需要嵌套 for 循环。