WHERE mycommand
IF %ERRORLEVEL% NEQ 0 ECHO mycommand wasn't found
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?
WHERE mycommand
IF %ERRORLEVEL% NEQ 0 ECHO mycommand wasn't found
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.
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.
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
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"
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 .
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
)
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
Tags command-line windows batch script