代码之家  ›  专栏  ›  技术社区  ›  Sean McCallum

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

  •  1
  • Sean McCallum  · 技术社区  · 6 年前

    我正在尝试获取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循环没有太多经验,所以我的问题是: 我怎样才能找到所有的代币?(无需执行%%a%%b…%Z) 我可以用嵌套for循环吗?

    我最初的想法是我可以

    set JAVA_HOME=%%*
    

    但这不管用。

    2 回复  |  直到 6 年前
        1
  •  1
  •   michael_heath    6 年前
    @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=string中的最后一个字符是 星号,则另一个变量是 分配和接收 剩余文本 在 最后一个令牌解析后的行。

    令牌选项 1,2* :

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

    skip 用作链接的选项 Real's HowTo 在这个问题上 显示winxp和win7的整数变化。 对第一个令牌值的检查决定要使用的行,该行可以是 winxp、win7及更高版本的通用。

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

        2
  •  0
  •   Compo    6 年前

    你能不能不用 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 按要求