A opção mais simples é usar o comando WHERE - no entanto, é bastante lento. Por padrão, ele lista todos os arquivos correspondentes possíveis no diretório atual e nos diretórios PATH. Ele pesquisa usando o argumento fornecido e também pesquisa com cada uma das extensões PATEXT anexadas.
where java
O primeiro arquivo listado representa o arquivo que seria executado. Este valor pode mudar dependendo do seu diretório atual. Um script em lote simples pode ser usado para retornar apenas o arquivo que seria executado. Eu escrevi o script para tomar o comando como o primeiro e único argumento. Por isso, pode ser usado para localizar qualquer comando externo.
@echo off
for %%F in ('where "%~1"') do (
echo %%F
exit /b
)
Supondo que o script seja chamado WHICH1.BAT, o uso seria
which1 java
Existe um método mais rápido usando a expansão %~f$PATH:1
. No entanto, você deve conhecer a extensão do arquivo executável. Além disso, normalmente não aparece no diretório atual. Portanto, é melhor criar um PATH modificado temporariamente que inclua o diretório atual na frente. É improvável, mas um dos caminhos dentro do PATH pode conter caracteres de veneno não citados, portanto, uso a expansão atrasada. Mas há a possibilidade improvável de que um caminho contenha !
, que seria corrompido com a expansão atrasada, portanto, desative-o novamente. O resultado final é citado para proteger contra caracteres envenenados.
@echo off
setlocal enableDelayedExpansion
set "modPath=.;!path!"
setlocal disableDelayedExpansion
echo "%~f$modPath:1"
Se o script acima for WHICH2.BAT, o uso é
which2 java.exe
Todos os scripts acima não reconhecerão comandos internos.
Eu escrevi um robusto script WHICH.BAT que listará corretamente um comando como interno quando apropriado, caso contrário ele será listar o comando externo que seria executado.
O uso é
which java