Henrik
Henrik

Reputation: 1807

batch script to set java homepath/path - only add to path if not already contains

I've wroten a script to set java homepath/path to use for switching between different versions of java.

I want only want to set path if it doesn't already contains the location string to java's bin folder. As it is now, it adds to path multiple times if i run the script multiple times. How can i acchieve this?

Code

@echo off  
echo Setting JAVA_HOME  
setx -m JAVA_HOME "C:\Program Files\Java\jdk1.8.0"
echo JAVA_HOME: %JAVA_HOME% 
echo setting PATH
setx -m PATH "%Path%;%JAVA_HOME%\bin"
echo PATH: %PATH%  
echo Display java version  
java -version  
pause

Can i use if condition somehow?

Thank you...

EDIT: If i already set a java_homepath and path to java 7 jdk and in the script will set it to java jdk 8 it sets the java_homepath but when setting the path it uses the old java homepath so i need to run the script twice. Why is that and how can this be fixed?

EDIT2:

@echo off  
echo Setting JAVA_HOME  
setx -m JAVA_HOME "C:\Program Files\Java\jdk1.7.0"
echo JAVA_HOME: %JAVA_HOME% 
echo setting PATH
for /f "tokens=* delims=" %%a in ("%JAVA_HOME%\bin") do (
  if "%%~dpnfs$PATH:a" EQU "" (
   setx -m PATH "%Path%;%JAVA_HOME%\bin"
   PATH %PATH%;"%JAVA_HOME%\bin"
  )
)
echo PATH: %PATH%  
echo Display java version  
java -version  
pause

With this code it sets java_home but not path (because it uses old java_home), also it does not pause the cmd or displays java version after for loop...

Upvotes: 1

Views: 2758

Answers (3)

Conete Cristian
Conete Cristian

Reputation: 101

I did this script to toggle between java versions. Run it as Administrator. For java 10 changing the path doesn't work anymore because it ignore the JAVA_HOME and path, must uninstall 10 otherwise cannot downgrade.

If the final path string is longer than 1024 it will not work (setX limitation), try to delete "unnecessary" things from path.

@echo off 
set "JAVA5_FOLDER=C:\Java\jdk1.5.0_22"
set "JAVA6_FOLDER=C:\Java\jdk1.6.0_45"
set "JAVA7_FOLDER=C:\Java\jdk1.7.0_80"
set "JAVA8_FOLDER=C:\Java\jdk1.8.0_121"
set "JAVA9_FOLDER=C:\Java\jdk1.9.0_24"
set "CLEAR_FOLDER=C:\xxxxxx"

(echo "%PATH%" & echo.) | findstr /O . | more +1 | (set /P RESULT= & call exit /B %%RESULT%%)
set /A STRLENGTH=%ERRORLEVEL%
echo path length = %STRLENGTH%
if %STRLENGTH% GTR 1024  goto byebye 

echo Old Path: %PATH%
echo =================== 
echo Choose new Java Version:
echo [5] JDK5
echo [6] JDK6 
echo [7] JDK7
echo [8] JDK8
echo [9] JDK10
echo [x] Exit

:choice 
SET /P C=[5,6,7,8,9,x]? 
for %%? in (5) do if /I "%C%"=="%%?" goto JDK_L5 
for %%? in (6) do if /I "%C%"=="%%?" goto JDK_L6
for %%? in (7) do if /I "%C%"=="%%?" goto JDK_L7 
for %%? in (8) do if /I "%C%"=="%%?" goto JDK_L8 
for %%? in (9) do if /I "%C%"=="%%?" goto JDK_L9
for %%? in (x) do if /I "%C%"=="%%?" goto byebye
goto choice 

@echo on
:JDK_L5  
set "NEW_PATH=%JAVA5_FOLDER%"
goto setPath

:JDK_L6  
@echo off 
set "NEW_PATH=%JAVA6_FOLDER%"
goto setPath

:JDK_L7  
@echo off 
set "NEW_PATH=%JAVA7_FOLDER%"
goto setPath

:JDK_L8  
@echo off 
set "NEW_PATH=%JAVA8_FOLDER%"
goto setPath

:JDK_L9  
@echo off 
set NEW_PATH = %JAVA9_FOLDER%

:setPath
Call Set "PATH=%%PATH:%JAVA5_FOLDER%=%CLEAR_FOLDER%%%"
Call Set "PATH=%%PATH:%JAVA6_FOLDER%=%CLEAR_FOLDER%%%"
Call Set "PATH=%%PATH:%JAVA7_FOLDER%=%CLEAR_FOLDER%%%"
Call Set "PATH=%%PATH:%JAVA8_FOLDER%=%CLEAR_FOLDER%%%"
Call Set "PATH=%%PATH:%JAVA9_FOLDER%=%CLEAR_FOLDER%%%"
rem echo Interim Path: %PATH%
Call Set "PATH=%%PATH:%CLEAR_FOLDER%=%NEW_PATH%%%" 

setx PATH "%PATH%" /M

call set "JAVA_HOME=%NEW_PATH%"
setx JAVA_HOME %JAVA_HOME% 

echo New Path: %PATH%
:byebye
echo
java -version
pause

Upvotes: 0

npocmaka
npocmaka

Reputation: 57322

@echo off  
echo Setting JAVA_HOME
set "JAVA_HOME=C:\Program Files\Java\jdk1.7.0"  
setx -m JAVA_HOME "%JAVA_HOME%"
echo JAVA_HOME: %JAVA_HOME% 
echo setting PATH
    for /f "tokens=* delims=" %%a in ("%JAVA_HOME%\bin") do (
      if "%%~dpnfs$PATH:a" EQU "" (
       setx -m PATH "%JAVA_HOME%\bin;%Path%"
       PATH "%JAVA_HOME%\bin";%PATH%
      )
    )

setx will not affect current cmd session so you need additional call of PATH command

EDIT:

@echo off
for /f tokens^=2-5^ delims^=.-_^" %%j in ('java -fullversion 2^>^&1') do @set "jver=%%j%%k%%l"
set "JAVA_HOME=C:\Program Files\Java\jdk1.7.0"
if %jver% GTR 179 (
           setx -m PATH "%JAVA_HOME%\bin;%Path%"
           set "PATH="%JAVA_HOME%\bin";%PATH%"
)

Upvotes: 1

Stephan
Stephan

Reputation: 56228

echo %path%|find "%JAVA_HOME%\bin" >nul || setx -m PATH "%Path%;%JAVA_HOME%\bin"

write it (echo), check if it contains the string (find), don't write to screen (>nul) and if not found (||), set the variable.

Upvotes: 2

Related Questions