Determina se o comando é reconhecido em um arquivo de lote

38

Estou escrevendo um script de bat em que invoco um programa (como o javac). Para simplificar, quero verificar se o comando existe antes de executá-lo. ou seja, se o comando existir no PATH.

Por exemplo,

if (my_command.exe is a recognized command) then (
  my_command.exe my_args
) else (
  REM Output was probably "'my_command.exe' is not recognized as an internal or external command, operable program or batch file."
  REM Do not run my_command.exe
)

Qual é a melhor maneira de fazer isso no Windows?

    
por user46097 13.08.2010 / 14:32

8 respostas

47

WHERE mycommand
IF %ERRORLEVEL% NEQ 0 ECHO mycommand wasn't found 
    
por 18.02.2014 / 00:31
12

O código abaixo deve sempre ser executado de forma limpa, sem saída de lixo.

javac -version >nul 2>&1 && (
    echo found javac
) || (
    echo fail
)

Saída:

found javac

O mesmo código de uma linha:

javaz -version >nul 2>&1 && ( echo found javac ) || ( echo fail )

Saída:

fail

Observe que a ordem de && e || parece ser importante. Além disso, o comando cuja existência você está testando precisa retornar com um errorlevel < = 0 para que isso funcione. Espero que o comando tenha /? ou --help argumentos ou, como com java, um comando info info.

    
por 14.05.2013 / 23:39
5

A maneira mais fácil é simplesmente executar o comando, mas isso tem outros problemas, é claro, já que talvez você não queira que um processo aleatório seja iniciado.

for %%x in (my_command.exe) do if not [%%~$PATH:x]==[] set MyCommandFound=1

é uma alternativa que procura o programa nos caminhos listados pela variável de ambiente %PATH% . É essencialmente uma versão em lote puro de which(1) . Pode ser melhor, mas essencialmente é isso.

    
por 14.08.2010 / 15:14
3

Alguns refinamentos para a versão abaixo. Teste esse comando e suprima a saída desnecessária.

WHERE scp >nul 2>nul
IF %ERRORLEVEL% EQU 0 ECHO scp found
    
por 13.10.2015 / 12:20
2

Para minha situação. A maneira mais simples absoluta é usar o || ou & & operador.

my_command.exe -version 2>NUL && echo "my_command exists"

ou

my_command.exe -version 2>NUL || echo "my_command doesn't exist"
    
por 13.08.2010 / 15:55
1

Se for necessário instalar ferramentas extras, há um comando where nos kits de recursos; veja o equivalente Windows de whereis? .

Caso contrário, para versões do Windows que não são muito antigas, é possível em cmd , como mencionado em Dos executável de pesquisa, exceto PATH .

    
por 13.08.2010 / 15:03
1

Eu sei que isso não é exatamente o que você está procurando, mas com uma pequena mudança na lógica, ele deve realizar o que você precisa.

Todo comando executado possui um código de retorno (também conhecido como errorlevel), se o código de retorno for 0 (zero), o comando foi executado com sucesso, se o código de retorno for maior que 0, algo deu errado.

Veja aqui para mais detalhes.

Algo como -

my_command
if (%ERRORLEVEL% > 0) then (
  REM Output was probably "'my_command.exe' is not recognized as an internal or external command, operable program or batch file.  OR SOMETHING WENT WRONG WITH IT."
  REM Do not run my_command.exe
)
    
por 13.08.2010 / 15:59
0

Embora todo esse caminho possa funcionar, por que não o caminho embutido?

If exists my_command do echo "my_command exists"

Executar "se /?" na linha de comando para detalhes

    
por 06.06.2011 / 02:39