batch-file - 批量获取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=%%*
但这不起作用。
解决方案
@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
此任务不需要嵌套循环。
推荐阅读
- c# - 在 MVC 中如何识别来自请求的结果/数据是缓存数据还是新鲜数据?
- javascript - 如何在 D3 图表中添加一条线
- php - php按钮onclick执行mysq - 没有显示?
- .net - 我如何在存储过程中使用 dtsExec 命令通过从表中传递整个配置来执行 ssis 包?
- docker - docker-compose.yml - 无法通过浏览器连接到应用程序
- c# - 当发布也构建时,为什么我们将构建和发布分为两个步骤?
- ansible - Ansible Tower 工作流暂停执行
- laravel - Laravel 获取当前用户数据的问题
- php - Google AppEngine PHP 连接 MySQL 失败
- android - 找不到 Gradle DSL 方法:'setApplicationId()'