2010-01-12 28 views
5

Tôi đang tìm một đoạn mã tập tin bằng cách nào đó đọc đăng ký Windows và phát hiện Java JDK nào trên hệ thống Windows và sau đó hỏi người dùng cái nào họ muốn sử dụng và ghi nhớ lựa chọn.Làm thế nào để phát hiện Java được cài đặt thông qua REGEDIT.exe từ một tập tin thực thi?

Đây là những gì tôi có cho đến nay ... cần một số sửa đổi. Kịch bản này chỉ tìm thấy JDK đầu tiên ... nó không xử lý bội số.

@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 

Trả lời

2

Ok, cuối cùng tôi đã tìm ra câu trả lời. Phải mất một thời gian, và mã này thực sự là thô, nhưng nó hoạt động. Nếu ai đó muốn cải thiện nó, tôi sẽ trao cho họ các điểm trả lời:

@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

Bạn có thể kiểm tra các mục dưới HKEY_LOCAL_MACHINE \ SOFTWARE \ JavaSoft \ Java Runtime Environment trong registry

+0

đó là những gì tôi đang làm trong ví dụ trên. Tôi hy vọng một ý tưởng khéo léo hơn ... – djangofan

0

Bạn có thực sự cần phải sử dụng Windows registry? Nếu không, bạn có thể kiểm tra sự tồn tại của các biến môi trường JAVA_HOME và/hoặc JDK_HOME. Nếu chúng tồn tại, thì chúng trỏ đến thư mục cài đặt của bản cài đặt Java, và bạn có thể giả định rằng cài đặt Java mà chúng trỏ đến là một người dùng muốn sử dụng.

+0

Ý định của tôi là lọc đầu tiên, nhưng nếu không tồn tại thì tôi muốn tìm kiếm sổ đăng ký và thực hiện tìm kiếm tệp và so sánh để xem hệ thống tệp có đồng ý hay không. – djangofan

Các vấn đề liên quan