У меня на компьютере установлено несколько JDK, и я работаю в системе, в которой есть переменная окружения с довольно длинным путем. Есть ли способ узнать, к чему относится мой вызов Java?

Я ищу что-то, что работает, как это, или может помочь мне сделать то же самое:

 C:\> set path=c:\program files\java\jre1.8.0.20\bin\;%path%;
 C:\> lookup java
 java => c:\program files\java\jre1.8.0.20\bin\java.exe

 C:\> set path=c:\program files(x86)\java\jre1.8.0.20\bin\;%path%;
 C:\> lookup java
 java => c:\program files(x86)\java\jre1.8.0.20\bin\java.exe

Я, вероятно, могу понять это с помощью диспетчера задач, открытого местоположения процесса и т.д., Но я бы хотел иметь возможность обернуть это в скрипт.

1 ответ1

1

Самый простой вариант - использовать команду WHERE, однако она довольно медленная. По умолчанию в нем перечислены все возможные совпадающие файлы в текущем каталоге и в каталогах PATH. Поиск выполняется с использованием заданного аргумента, а также с каждым добавленным расширением PATEXT.

where java

Первый файл в списке представляет файл, который будет выполнен. Это значение может меняться в зависимости от вашего текущего каталога. Простой пакетный скрипт может использоваться для возврата только того файла, который будет выполнен. Я написал сценарий для принятия команды в качестве 1-го и единственного аргумента. Так что его можно использовать для поиска любой внешней команды.

@echo off
for %%F in ('where "%~1"') do (
  echo %%F
  exit /b
)

Предполагая, что скрипт называется WHICH1.BAT, то использование будет

which1 java

Существует более быстрый метод, использующий расширение %~f$PATH:1 . Однако вы должны знать расширение исполняемого файла. Кроме того, он обычно не выглядит в текущем каталоге. Поэтому лучше всего создать временную модифицированную переменную PATH, включающую текущий каталог на передней панели. Это маловероятно, но один из путей в пределах PATH может содержать символы-кавычки без кавычек, поэтому я использую отложенное расширение. Но тогда маловероятно, что путь может содержать ! , который будет поврежден с задержкой расширения, поэтому я отключаю его снова. Окончательный результат цитируется для защиты от ядовитых персонажей.

@echo off
setlocal enableDelayedExpansion
set "modPath=.;!path!"
setlocal disableDelayedExpansion
echo "%~f$modPath:1"

Если приведенный выше сценарий WHICH2.BAT, то использование

which2 java.exe

Все вышеперечисленные скрипты не распознают внутренние команды.

Я написал надежный сценарий WHICH.BAT, который при необходимости будет правильно перечислять команду как внутреннюю, в противном случае будет отображаться внешняя команда, которая будет выполнена.

Использование

which java

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .