我需要在系统中找到特定的文件位置(在我的例子中为java)。为此,我将首先通过%PATH%变量和来自此处的优秀脚本进行搜索:'Pretty print' windows %PATH% variable - how to split on ';' in CMD shell
但是如果在路径中找不到命令(或者,找到它,但是不合适 - 在我的情况下我在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循环的第一次迭代中给出了完整的路径变量。
有人能指出我的方向有什么不对吗?
答案 0 :(得分: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的“正确”方法是询问窗口。
@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