2016-09-25 21 views
1

我正在放置一个批处理文件以从当前安装的JRE列表中设置JAVA_HOME。然后它将设置添加bin目录的路径。Dos为/ f循环在解析reg查询时增加额外空间

它让我们挑剔,但是我看到%JAVA_HOME%之后有一个额外的空间。所以这条道路最终错了。

@echo off 
setlocal EnableDelayedExpansion 

::Script to set JRE or JDK Home. 
@set KeyName=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit 
::@set KeyName=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment 
@set x=0 
:: Query with sub-dirs (/s) in regisry 'tree' 
:: 
@set Cmd=reg query "%KeyName%" /s 

:: Loop against text string 
::for /f "tokens=2*" %%i in ('%Cmd% ^| find "JavaHome"') do set JAVA_HOME=%%j 

echo Pick the JRE 
for /f "tokens=2*" %%i in ('%Cmd% ^| find "JavaHome"') do (set /a "x+=1" & set JHOME[!x!]=%%j & @echo !x! %%j) 

set /p y= 
@echo You picked: %y% 

@set JAVA_HOME=!JHOME[%y%]! 
@set PATH=%JAVA_HOME%\BIN;%PATH% 
@echo Java Home set to: 
@echo %JAVA_HOME%isthis 
@echo Path Set to: 
@echo %PATH% 

运行时会得到以下结果。注意“_101”和“thisis”之间的空格。路径上的\ BIN之前还有一个空格。 我无意中添加了空间吗? 谢谢! Ĵ C:\ MYDIR \ SetJDK.bat

Pick the JRE 
1 C:\Program Files\Java\jdk1.8.0_101 
2 C:\Program Files\Java\jdk1.8.0_101 
2 
You picked: 2 
Java Home set to: 
C:\Program Files\Java\jdk1.8.0_101 isthis 
Path Set to: 
C:\Program Files\Java\jdk1.8.0_101 \BIN;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32; 
+3

将空间添加到已设置JHOME [!x!] = %% j&...'的位置。你应该引用变量=值对,比如'set“JHOME [!x!] = %% j”&...'。对于它的价值,现代JRE版本符合当前版本在'C:\ ProgramData \ Oracle \ Java \ javapath'中的链接。如果将该目录添加到“%PATH%”中,则根本不需要批处理脚本。 – rojo

+0

谢谢@rojo!你的解决方案工作欣赏symlink tip.Solaris做同样的事情。我正在为各种JRE/JDK组合测试各种旧版Oracle应用的Java部署规则集。我想要一个快速的方法来“发现”不同的JRE/JDK Homes。我想过修改链接,但决定采用REG方法。 – MidnightDBA

回答

0

额外的空间从符号前的空格到来。它包含在SET操作中。

您可以通过删除该空间来修复它。

do (set /a "x+=1"& set JHOME[!x!]=%%j& @echo !x! %%j) 
+0

谢谢@soja!你的解决方案也可以工作!我提出了你的答案,但我只是一个小白点,所以你必须等待我的猜测。一旦我清理了一下并列出了JDK和JRE的选择。我将它作为答案发布。也许别人会觉得它有用?我确定厌倦了运行一堆安装批处理文件。 – MidnightDBA