Самый простой вариант - использовать команду 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