首页 > 解决方案 > 批量获取for循环的所有结果(%%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)被空格分割。如果路径中有多个空格,则将无法输出整个路径。

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

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

set JAVA_HOME=%%*

但这不起作用。

标签: batch-filefor-loopregistrystring-parsing

解决方案


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

如果 tokens= 字符串中的最后一个字符是星号,则分配一个附加变量并在最后一个标记解析后接收行上的剩余文本

代币选项1,2*

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

问题中没有skip用作Real's HowTo链接的选项显示 WinXP 和 Win7 的整数变化。对第一个标记值的检查决定了要使用的行,这对于 WinXP、Win7 和更高版本可能是通用的。

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


推荐阅读