2010-01-12 6 views
5

어떻게 든 Windows 레지스트리를 읽고 Windows 시스템에있는 Java JDK를 감지 한 다음 사용자에게 사용하고자하는 것을 묻고 선택 사항을 기억하는 배치 파일 스 니펫을 찾고 있습니다.Java를 감지하는 방법은 배치 파일의 REGEDIT.exe를 통해 설치됩니까?

내가 지금까지 가지고있는 것은 ... 수정이 필요합니다. 이 스크립트는 첫 번째 JDK 만 찾았지만 배수는 처리하지 않습니다.

@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 

답변

2

좋아, 나는 결국 대답을 알아 냈다. 시간이 좀 걸렸지 만이 코드는 정말 거칠지 만 작동합니다. 누군가가 그것을 향상시키고 자한다면, 대답 포인트를 부여 할 것입니다 :

@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

당신은 레지스트리

+0

위 예제에서 무엇을하고 있는지를 알려줍니다. 메신저 더 독창적 인 아이디어를 기대하고 ... – djangofan

0

에서 자바 소프트 \ 자바 런타임 환경 \ HKEY_LOCAL_MACHINE \ 소프트웨어 아래의 항목을 확인할 수 있습니다 당신이 정말로 Windows 레지스트리를 사용해야합니까? 그렇지 않은 경우 JAVA_HOME 및/또는 JDK_HOME 환경 변수가 있는지 확인할 수 있습니다. 존재하는 경우, Java 설치의 설치 디렉토리를 가리키며, 그들이 가리키는 Java 설치가 사용자가 사용하려고하는 것으로 가정 할 수 있습니다.

+0

내 의도는 그 필터를 먼저하는 것입니다,하지만 그 사람이 존재하지 않는 경우 나는 레지스트리를 검색하고 파일 검색을하고 파일 시스템이 동의하는지 비교하기를 원합니다. – djangofan