Estou procurando uma maneira simples de testar se existe um executável na variável de ambiente PATH de um arquivo em lote do Windows.
O uso de ferramentas externas não fornecidas pelo sistema operacional não é permitido. A versão mínima do Windows necessária é o Windows XP.
Respostas:
Se você precisar disso para extensões diferentes, apenas repita
PATHEXT
:Pode ser que
where
também já exista em versões legadas do Windows, mas não tenho acesso a uma, então não posso dizer. Na minha máquina também funciona o seguinte:e retorna com um código de saída diferente de zero se não puder ser encontrado. Em um lote, você provavelmente também deseja redirecionar a saída
NUL
.Tenha em mente
A análise em
.bat
arquivos batch ( ) e na linha de comando difere (porque os arquivos batch têm%0
-%9
), então você precisa dobrar o valor%
. Na linha de comando isso não é necessário, portanto, as variáveis são justas%X
.fonte
where myExecutable
.%0
-%9
), então você precisa dobrar o número%
. Na linha de comando isso não é necessário, então asfor
variáveis são justas%x
.O Windows Vista e as versões posteriores são fornecidos com um programa chamado
where.exe
que procura programas no caminho. Funciona assim:Para uso em um arquivo em lote, você pode usar a
/q
opção, que apenas defineERRORLEVEL
e não produz nenhuma saída.Ou uma versão abreviada simples (mas menos legível) que imprime a mensagem e sai do seu aplicativo:
fonte
Aqui está uma solução simples que tenta executar o aplicativo e trata qualquer erro posteriormente .
O código de erro 9009 geralmente significa arquivo não encontrado.
A única desvantagem é que
file.exe
é realmente executado se for encontrado (o que em alguns casos não é desejável).fonte
Isso pode ser feito por meio da substituição de parâmetros.
Isso retorna o caminho completo do nome do arquivo executável em% 1, caso contrário, uma string vazia.
Isso não funciona com variáveis definidas pelo usuário. Portanto, se o nome do arquivo executável não for um parâmetro para o seu script, você precisará de uma sub-rotina. Por exemplo:
Veja http://ss64.com/nt/syntax-args.html
fonte
setlocal
masfor %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
é uma solução de linhafor
usada como solução alternativa para%%~$PATH:X
evitarcall
e%~$PATH:1
.fonte
for
não é inteligente o suficiente para analisar o conteúdoPATH
. Irá perder diretórios com espaços, por exemplo. E mesmo quando você usafor /f
comdelims=;
ele não funcionará corretamente se um diretório contiver um;
e estiver entre aspas.;
com"; "
:set quotedPath="%PATH:;="; "%"
."C:\Folder with; semicolon, quoted"
ao caminho e veja o que acontece. Pelo menos aqui ele tenta tratar cada »palavra« separadamente o que, de certa forma, é pior do que o comportamento anterior.Às vezes, essa solução simples funciona, na qual você verifica se a saída corresponde ao que você espera. A primeira linha executa o comando e pega a última linha da saída padrão.
fonte
Se você está procurando algo como eu na pasta de inicialização, vá para a pasta. Por exemplo, procuro exe na pasta de inicialização e uso este código como
fonte
program.exe
existe, não apenas em uma pastaUse o comando: PowerShell Test-Path "exe que você está procurando"
Ele retornará True se estiver presente, caso contrário, False.
fonte
Test-Path
verifica apenas o caminho especificado, ou sejaTest-Path nuget.exe
, retornará verdadeiro apenas senuget.exe
estiver no diretório atual. Se nuget.exe não estiver no diretório atual, ele retornará falso, mesmo se estiver em um diretório listado na variável PATH. No PowerShellGet-Command
pode funcionar melhor ( stackoverflow.com/questions/11242368/… ), mas leve em consideração que para o PowerShell o diretório atual não está no caminho.(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
retornará verdadeiro se for encontrado local ou no caminho.Para quem procura uma opção PowerShell. Você pode usar o
Get-Command
cmdlet passando dois itens. Primeiro forneça a localização dir atual com.\
prefixado e, em seguida, forneça apenas o nome exe.Isso retornará verdadeiro se for encontrado em caminhos locais ou em todo o sistema.
fonte