批量获取 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
循环。
我正在尝试获取 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
循环。