2010-01-12 8 views
5

Sto cercando uno snippet di file batch che in qualche modo legge il registro di Windows e rileva quale Java JDK è su un sistema Windows e poi chiede all'utente quale desidera utilizzare e ricorda la scelta.Come rilevare Java viene installato tramite REGEDIT.exe da un file batch?

Ecco quello che ho finora ... ha bisogno di alcune modifiche. Questo script trova solo il primo JDK ... non gestisce i multipli.

@echo off 
SETLOCAL EnableDelayedExpansion 
:: findJDK.bat 
start /w regedit /e reg1.txt "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit" 
type reg1.txt | find "JavaHome" > reg2.txt 
if errorlevel 1 goto ERROR 
for /f "tokens=2 delims==" %%x in (reg2.txt) do (
    set JavaTemp=%%~x 
    echo Regedit: JAVA_HOME path : !JavaTemp! 
) 
if errorlevel 1 goto ERROR 
echo. 
set JAVA_HOME=%JavaTemp% 
set JAVA_HOME=%JAVA_HOME:\\=\% 
echo JAVA_HOME was found to be %JAVA_HOME% 
goto END 
:ERROR 
echo reg1.txt is: & type reg1.txt 
echo reg2.txt is: & type reg2.txt 
echo 
:END 
del reg2.txt 
del reg1.txt 
pause>nul 

risposta

2

Ok, ho finalmente capito la risposta. Ci è voluto un po ', e questo codice è veramente approssimativo, ma funziona. Se qualcuno vuole migliorarlo, assegnerò loro i punti di risposta:

@ECHO off 
SET TITLE=detectJDK.bat 
TITLE=%TITLE% 
SETLOCAL ENABLEDELAYEDEXPANSION 
IF EXIST jdkhome.txt (
    ECHO JDK home already set in jdkhome.txt file. 
    GOTO :END 
) 
ECHO. 2>merged.txt 
ECHO. 2>list.txt 
ECHO. 2>uniquelist.txt 
IF NOT EXIST reg32.txt ECHO. 2>reg32.txt 
IF NOT EXIST reg64.txt ECHO. 2>reg64.txt 
START /w REGEDIT /e reg32.txt "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\JavaSoft\Java Development Kit" 
TYPE reg32.txt | FIND "JavaHome" > merged.txt 
START /w REGEDIT /e reg64.txt "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit" 
TYPE reg64.txt | FIND "JavaHome" >> merged.txt 
FOR /f "tokens=2 delims==" %%x IN (merged.txt) DO (
    CALL :STRIP "%%~x" >>list.txt 
) 

FOR /F "tokens=* delims= " %%a IN (list.txt) DO (
    SET str=%%a 
    FIND /I ^"!str!^" list.txt>nul 
    FIND /I ^"!str!^" uniquelist.txt>nul 
    IF ERRORLEVEL 1 ECHO !str!>>uniquelist.txt 
) 

ECHO Select a JDK from the list: 
SET /A COUNT=0 
FOR /f "tokens=1,* delims=" %%y IN (uniquelist.txt) DO (
    SET /A COUNT += 1 
    ECHO !COUNT!: %%~y 
) 
SET /P NUMBER=Type a number here: 
SET /A COUNT=0 
FOR /f "tokens=1,* delims=" %%z IN (uniquelist.txt) DO (
    SET /A COUNT += 1 
    IF !COUNT!==!NUMBER! (
    SET JAVA_HOME=%%~z 
) 
) 
ECHO. 
ECHO JAVA_HOME was found to be %JAVA_HOME% 
ECHO %JAVA_HOME%>jdkhome.txt 
GOTO CLEANUP 

:CLEANUP 
DEL /Q merged.txt 
DEL /Q list.txt 
DEL /Q uniquelist.txt 
DEL /Q reg32.txt 
DEL /Q reg64.txt 
GOTO :END 

:: Strip quotes and extra backslash from string 
:STRIP 
SET n=%~1 
SET n=%n:\\=\% 
SET n=%n:"=% 
IF NOT "%n%"=="" ECHO %n% 
GOTO :EOF 

:END 
FOR /l %%a in (5,-1,1) do (TITLE %TITLE% -- Closing in %%as&ping -n 2 -w 1 127.0.0.1>NUL) 
:: end 
1

Si potrebbe verificare le voci sotto HKEY_LOCAL_MACHINE \ SOFTWARE \ JavaSoft \ Java Runtime Environment nel Registro

+0

questo è quello che sto facendo nell'esempio sopra. Sto sperando in un'idea più geniale ... – djangofan

0

Avete davvero bisogno di usare il registro di Windows? In caso contrario, è possibile verificare l'esistenza delle variabili di ambiente JAVA_HOME e/o JDK_HOME. Se esistono, quindi puntano alla directory di installazione dell'installazione Java e si può presumere che l'installazione Java a cui puntano sia quella che l'utente desidera utilizzare.

+0

La mia intenzione è quella di filtrare per primo, ma se quelli non esistono allora voglio cercare nel registro e fare una ricerca di file e confrontare per vedere se il file system è d'accordo. – djangofan