Onde o “START” está procurando por executáveis?

Na minha empresa, usamos um arquivo em lote para iniciar o Matlab. O arquivo em lote prepara o ambiente antes de iniciar o Matlab.

O próprio Matlab é iniciado com

START MATLAB.EXE 

Eu tenho várias versões do Matlab instalado no meu sistema. E este comando está iniciando a versão errada do Matlab. Onde o START está procurando os executáveis?

O comando start encontra executáveis ​​para executar como o interpretador de linha de comando cmd.exe se nenhum caminho absoluto for usado, usando adicionalmente as extensões listadas na variável de ambiente PATHEXT separadas por ponto e vírgula se a extensão de arquivo também estiver ausente.

  1. Diretório de trabalho atual.

  2. Todos os diretórios da variável de ambiente PATH em ordem, conforme listado em PATH .

    Basta digitar um set path janelas do prompt de comando para ver todos os diretórios no PATH , bem como todas as extensões de arquivo no PATHEXT .

    Por favor, note que cada conta de usuário tem seu próprio caminho . Portanto, o PATH da conta do sistema geralmente é diferente do PATH de uma conta de usuário padrão. Isso é muito importante na execução de um arquivo em lote com runas de comando ou através do agendador de tarefas usando uma conta diferente.

    O arquivo em lote postado por Jason Faulkner é muito útil aqui também.

  3. começar parece ainda mais no registro sob as chaves

    Caminhos HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ App
    Caminho HKEY_CURRENT_USER \ Software \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ App
    Caminhos HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ App
    Caminho HKEY_LOCAL_MACHINE \ Software \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ App

    Os aplicativos instalados com um pacote MSI (incorporado no instalador EXE ou publicado separadamente) usando o msiexec têm seu nome de arquivo registrado em Caminhos do aplicativo com o valor da sequência padrão contendo o nome do executável com o caminho completo. Geralmente, há um segundo valor de string com o nome Path contendo apenas o caminho completo para o executável do aplicativo. Outros instaladores registram um aplicativo também em App Paths , consulte o artigo da Microsoft sobre o Registro do Aplicativo .

A chave de caminho de aplicativo no hive do Registro HKEY_CURRENT_USER geralmente não existe porque a instalação é feita usando o instalador confiável ou a conta do administrador local e, portanto, o registro do aplicativo instalado é feito no hive do Registro HKEY_LOCAL_MACHINE . Mas, em uma instalação por usuário de um aplicativo, o caminho HKCU é usado para o registro do aplicativo em vez do caminho HKLM .

A chave Paths do aplicativo na chave Wow6432Node existe somente no Windows x64. No entanto, os aplicativos x86 são registrados em ambos os Caminhos do Aplicativo, embora o Wow6432Node seja para aplicativos de 32 bits e a outra tree para aplicativos de 64 bits no Windows 7 x64, Windows Server 2008 R2 x64 e Windows x64 posterior. Para obter detalhes, consulte as chaves de registro do artigo da Microsoft afetadas pelo WOW64 .

Mais uma nota:

Mesmo com o .exe especificado, inicie as pesquisas no diretório de trabalho atual, bem como nos diretórios do PATH depois de não encontrar o AppName.exe adicionalmente no AppName.exe.* E verifique a extensão do arquivo (string após o último período) em relação às extensões de arquivo no PATHEXT. retorna um ou mais nomes de arquivos. No entanto, é sempre melhor especificar a extensão de arquivo do aplicativo para iniciar, já que uma pesquisa por AppName.exe sempre é feita antes de a pesquisa de curinga ser executada, se AppName.exe não puder ser encontrado no diretório atual.

A ferramenta gratuita Process Monitor da Sysinternals (Microsoft) é uma ótima ferramenta para descobrir coisas desse tipo.

Por último, mas não menos importante, nenhum executável inicia a verificação também de HKEY_CLASSES_ROOT para que uma associação de arquivos abra um arquivo ou uma URI (URL) com o aplicativo associado definido para o comando open . Essa é a razão pela qual algo como abaixo também funciona.

 start MyTextFile.txt start https://stackoverflow.com/ 

%SystemRoot%\System32\cmd.exe contendo o código para start usa a function shell ShellExecuteEx do Windows para executar aplicativos ou abrir arquivos ou URLs com o aplicativo associado.

Você pode usar esse arquivo em lotes para detectar onde o sistema resolve o EXE em questão:

 @ECHO OFF REM Save this as C:\CheckPath.bat IF NOT "%~$PATH:1" == "" ( ECHO %~$PATH:1 ) ELSE ( ECHO Could not find "%~1" inside of a registered PATH. ) 

Agora correndo:

  • C:\CheckPath.bat cmd.exe devolve C:\Windows\System32\cmd.exe
  • C:\CheckPath.bat NotValid.exe retorna Could not find "NotValid.exe" inside of a registered PATH.

Tente executar CheckPath.bat MATLAB.exe e você pode ver onde o sistema está resolvendo o caminho para.

Nota – isso resolverá o diretório supondo que você não está redefinindo %PATH% em seu script.