Existe uma maneira de reverter a pesquisa em qual executável está sendo chamado?

0

Eu tenho vários JDKs instalados na minha máquina e estou executando em um sistema que possui uma variável de ambiente de caminho bastante longa. Existe uma maneira de ver o que minha chamada para java resolve?

Estou procurando algo que funcione assim ou me ajude a fazer a mesma coisa:

 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

Eu provavelmente consigo descobrir através do gerenciador de tarefas, da localização do processo aberto, etc., mas adoraria poder incluir isso em um script.

    
por jessehouwing 29.09.2014 / 13:48

1 resposta

1

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
    
por 29.09.2014 / 17:24