2013-10-31 66 views
0

我需要在系統中找到特定的文件位置(在我的情況下是java)。爲此,我會首先通過%PATH%變量搜索,並從這裏出色的腳本搜索:'Pretty print' windows %PATH% variable - how to split on ';' in CMD shell找到路徑中的文件,如果不存在,一些已知位置

但是,如果在路徑中找不到命令在64位環境下安裝java,通常是64位java),我也有一組位置可以查看(即程序文件名中的(x86))。

爲了使它更具可用性,我想在bat中調用一個函數來完成它,但這裏是我失敗的地方。

這個地步,我有:

::@echo off 
setlocal DisableDelayedExpansion 

set FILENAME=java 
set CMDLINE=-version -d32 
set JAVAPATH="C:\Program Files (x86)\Java\jre7\bin;C:\Program Files\Java\jre7\bin" 

call :Checkpath "%path%" 

if "%JAVALOC%!="" goto :EOF 

call :Checkpath %JAVAPATH% 

goto :EOF 

:Checkpath 
REM THIS following line seems to be the problem 
set var="%~1" 
set "var=%var:"=""%" 
set "var=%var:^=^^%" 
set "var=%var:&=^&%" 
set "var=%var:|=^|%" 
set "var=%var:<=^<%" 
set "var=%var:>=^>%" 
set "var=%var:;=^;^;%" 
set var=%var:""="% 
set "var=%var:"=""Q%" 
set "var=%var:;;="S"S%" 
set "var=%var:^;^;=;%" 
set "var=%var:""="%" 
setlocal EnableDelayedExpansion 
set "var=!var:"Q=!" 
for %%a in ("!var:"S"S=";"!") do (
    if "!!"=="" endlocal 
    if %%a neq "" echo %%~a\%FILENAME% %CMDLINE% 
    if %ERRORLEVEL%==1 (
    SET JAVALOC=%%a 
) 
) 


:EOF 
echo %JAVALOC% 

它不工作 - 沒有函數調用,一切都很好的腳本,傳遞路徑

set var=%path% 

,但使用功能,只是在FOR循環的第一次迭代中給出完整路徑變量。

任何人都可以指向一個方向什麼是錯的?

回答

0
:checkPath 
    rem Retrieve argument 
    set "var=%~1" 

    rem iterate over the list. ; is a separator in a list 
    for %%a in (%var%) do (
     set "directory=%%~a" 
     .... 
     .... 
    ) 

這將處理所有常見情況。

但是,在Windows機器中定位java的「正確」方法是詢問windows。

@echo off 
    setlocal enableextensions enabledelayedexpansion 

    rem Where to find java information in registry 
    set javaKey=HKLM\SOFTWARE\JavaSoft\Java Runtime Environment 

    rem Get current java version 
    set javaVersion= 
    for /f "tokens=3" %%v in ('reg query "%javaKey%" /v "CurrentVersion" ^| find /i "CurrentVersion"') do (
     set "javaVersion=%%v" 
    ) 
    if "%javaVersion%"=="" goto endProcess 

    rem Get javahome for current java version 
    for /f "tokens=2,*" %%d in ('reg query "%javaKey%\%javaVersion%" /v "JavaHome" ^| find /i "JavaHome"') do (
     set javaDir=%%e 
    ) 

    rem You need 32 bit version. Check for it 
    rem If there is a separate ProgramFiles for 32 bit, adapt path 

    if not "%programfiles%"=="%programfiles(x86)%" (
     set "javaDir=!javaDir:%programFiles%=%programFiles(x86)%!" 
    ) 

    echo JAVA_HOME=%javaDir% 

:endProcess 
    endlocal 
+0

超級!您的解決方案適用於查找Java - 謝謝! – Erik

相關問題