Estou escrevendo um script bat no qual invoco um programa (como javac). Para simplificar, quero verificar se o comando existe antes de executá-lo. ou seja, se o comando existe 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?
windows
command-line
batch
script
user46097
fonte
fonte
Respostas:
fonte
>nul 2>nul
atrás domycommand
.O código abaixo deve sempre ser executado de forma limpa, sem saída de lixo.
Saída:
O mesmo código de uma linha:
Saída:
Observe que a ordem
&&
e||
parece importar. Além disso, o comando cuja existência você está testando precisa retornar com um nível de erro <= 0 para que isso funcione. Espero que o comando tenha /? ou --help argumentos ou, como no java, um comando de informações da versão.fonte
A maneira mais fácil é simplesmente executar o comando, mas isso tem outros problemas, é claro, pois talvez você não queira iniciar um processo aleatório.
é uma alternativa que procura o programa nos caminhos listados pela
%PATH%
variável de ambiente. É essencialmente uma versão em lote pura dowhich(1)
. Pode ser melhorado, mas essencialmente é isso.fonte
Para a minha situação. A maneira mais simples e absoluta é usar o || ou operador &&.
ou
fonte
Alguns refinamentos para a versão abaixo. Teste esse comando e suprima a saída desnecessária.
fonte
WHERE \Windows\System32\cmd.exe
=>INFO: Could not find files for the given pattern(s).
Se a solicitação da instalação de ferramentas extras estiver correta, há um
where
comando nos kits de recursos; veja Windows equivalente de whereis? .Caso contrário, para versões do Windows que não são muito antigas, é possível fazê-lo em puro
cmd
, conforme mencionado em Pesquisa executável do Dos, exceto PATH .fonte
Sei que isso não é exatamente o que você está procurando, mas com uma ligeira mudança na lógica, ele deve realizar o que você precisa.
Todo comando executado tem 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 -
fonte
Embora todo esse caminho possa funcionar, por que não o construído de maneira?
Execute "se /?" na linha de comando para obter detalhes
fonte
PATH
.