0

システム内の特定のファイルの場所 (私の場合は Java) を見つける必要があります。そのために、最初に %PATH% 変数を検索し、ここから優れたスクリプトを検索します: 'Pretty print' windows %PATH% variable - how to split on ';' CMD シェルで

しかし、コマンドがパスに見つからない場合 (または、見つかったが適切ではない - 私の場合、64 ビット環境で 32 ビット Java インストールを探しており、通常は 64 ビット Java がパスにあります) 探す場所のセットがあります同様に(つまり、プログラムファイル名の(x86))。

より使いやすくするために、バットで関数を呼び出してやりたいのですが、ここで失敗します。

これまでのところ、私は持っています:

::@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 ループの最初の反復でフルパス変数が与えられるだけです。

誰かが間違っている方向に私を向けることができますか?

4

1 に答える 1

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
于 2013-10-31T10:28:03.540 に答える