【问题标题】:Get all results from for loop in batch (%%a %%b %%c ... %%z)批量获取for循环的所有结果(%%a %%b %%c ... %%z)
【发布时间】:2018-05-31 11:03:04
【问题描述】:

我正在尝试获取 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-file for-loop registry string-parsing


    【解决方案1】:
    @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。
    • * 获取 剩余文本 即 %%C == C:\Program Files\Java\jre1.6.0_06

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

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

    【讨论】:

    • 啊,那么我的原始代码实际上不是已经可以工作了吗? (感谢您的回答!)
    【解决方案2】:

    难道你不能只使用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

    【讨论】:

      猜你喜欢
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      相关资源
      最近更新 更多