O Prompt de Comando do Windows pesquisa em algum lugar diferente daqueles especificados pela variável PATH ao iniciar programas aplicativos?

33

Eu tentei o seguinte experimento.

Antes de começar, verifiquei a variável PATH do cmd, que tem o seguinte valor:

Path=C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\ProgramData\Lenovo\ReadyApps;C:\Program Files\Microsoft SQL Server0\Tools\Binn\;C:\Program Files\Microsoft SQL Server0\Tools\Binn\;C:\Program Files (x86)\Windows Live\Shared;C:\Program Files (x86)\Skype\Phone\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Calibre2\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;

Inicialmente, pensei que o cmd só procurava executáveis nos diretórios contidos na variável PATH, então escolhi aleatoriamente um aplicativo - winword.exe (Microsoft Word) e tentei iniciá-lo a partir da linha de comando:

start winword

Mas para minha surpresa, o programa é lançado! A razão pela qual estou surpreso é porque eu pesquisei todos os diretórios na variável PATH para o arquivo exe chamado 'winword', mas todas as minhas pesquisas apareceram vazias!

Concluí, portanto, que o prompt de comando deve ter conhecimento de pesquisa em locais diferentes daqueles especificados na variável PATH para procurar executáveis.

Então, obviamente, a próxima coisa que fiz foi procurar o local exato onde o arquivo executável 'winword' está localizado. Acontece que winword.exe está localizado aqui:

C:\Program Files\Microsoft Office 15\root\office15

Daí a idéia de que talvez o CMD olhe automaticamente através de ProgramFiles e ProgramFiles (x86) (e todos os seus subdiretórios) ao executar o comando 'start'? O que me levou a tentar lançar outro aplicativo instalado no meu computador, o Audacity, com o arquivo exe localizado em:

C:\Program Files (x86)\Audacity

Mais uma vez, para minha surpresa, o Audacity não foi lançado quando eu digitei:

start audacity

na linha de comando.

Eu adicionei o diretório contendo audacity.exe ao PATH:

set path=%path%;C:\Program Files (x86)\Audacity

depois do que tentei iniciar a audácia novamente:

start audacity

Bem, não surpreendentemente, o Audacity foi lançado.

O que eu quero saber é onde exatamente o prompt de comando procura executáveis? Por que é que winword.exe lança mesmo quando o diretório que contém não faz parte do PATH, mas a mesma coisa não é verdade para audacity.exe?

Eu tentei outros aplicativos também. O Chrome e o Firefox funcionam quando eu uso o comando start.

UPDATE: Estou executando o Windows versão 6.3.9600 (Windows 8.1)

    
por Anthony 23.08.2018 / 07:18

5 respostas

43

At first, I thought that cmd only looks for executables in the directories contained in the PATH variable, so I randomly picked an application - winword.exe (Microsoft Word) and tried to launch it from the command line:

O motivo winword.exe funcionou é que existe uma chave do registro que definiu o caminho para o Microsoft Word (Winword.exe). Uma chave semelhante existe para o Firefox.exe e Chrome.exe se esses aplicativos estiverem instalados.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

What I want to know is where exactly does the command prompt look for executables?

Variável PATH do sistema, Variável PATH do usuário e as várias chaves em ..\App Paths . Consegui confirmar que o Audacity não cria uma chave para si mesmo quando é instalado.

When the ShellExecuteEx function is called with the name of an executable file in its lpFile parameter, there are several places where the function looks for the file. We recommend registering your application in the App Paths registry subkey. Doing so avoids the need for applications to modify the system PATH environment variable.

  • The current working directory.
  • The Windows directory only (no subdirectories are searched).
  • The Windows\System32 directory.
  • Directories listed in the PATH environment variable.
  • Recommended: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

Fonte: Registro do aplicativo

    
por 23.08.2018 / 08:33
15

No prompt de comando, se você digitar apenas WinWord , ele não será executado.

Se você inserir START WinWord , ele será executado.

O comando Start é a chave aqui.

Quando você tenta executar um arquivo por meio do comando start, o Prompt de Comando não executa nenhuma pesquisa. Em vez disso, ele passa o nome do arquivo (e os argumentos) para o próprio Windows (por meio da chamada da API ShellExecuteEx), que deve então procurar a localização do arquivo. Existem vários locais pesquisados na seguinte ordem:

  • O diretório de trabalho atual.

  • O diretório Windows apenas (nenhum subdiretório é pesquisado).

  • O diretório Windows\System32 .

  • Diretórios listados na variável de ambiente PATH .

  • Recomendado:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

WinWord está nessa chave de registro. A chave está lá para evitar que PATH fique muito tempo.

    
por 23.08.2018 / 08:26
6

O programa (quando você especifica seu nome de módulo sem drive / caminho no prompt de comando) no processador de comandos do Windows (CMD.EXE) pode ser iniciado quando encontrado:

  • pela variável de ambiente PATH (tanto executável quanto hardlink / softlink / shortcut com o mesmo nome)

  • pelo alias DOSKEY

  • pelo caminho do aplicativo de HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths ou HKCU\Software\Microsoft\Windows\CurrentVersion\App Paths (ao usar o comando start )

Usando esse conhecimento (especialmente o último), você pode criar seus próprios aliases convenientes para você. Por exemplo, você pode criar HKCU\Software\Microsoft\Windows\CurrentVersion\App Paths\au.exe com valor padrão de C:\Program Files (x86)\Audacity\Audacity.exe e iniciar este aplicativo simplesmente digitando start au no prompt de comando.

    
por 23.08.2018 / 08:00
0

Embora as outras respostas provavelmente sejam o motivo específico no seu caso, há também outra resposta à sua pergunta, que poderia ter sido o caso de alguns outros aplicativos: no mesmo lugar em que você estava procurando, mas com extensões de arquivo diferentes .

Você disse especificamente que estava pesquisando arquivos com extensão exe . O Windows também tentará executar arquivos de outras extensões.

Outra variável de ambiente que entra em jogo quando se executa um comando é a variável PATHEXT . Esta é uma lista de extensões de arquivos ; -delimited para tentar executar. Se você ecoa PATHEXT , talvez veja algo como .COM;.EXE;.BAT;.CMD;.VBS; ... (etc.). Alguns aplicativos usam esses outros tipos de arquivo como ponto de entrada do usuário final. É muito menos comum, mas acontece. Eu usei vários produtos comerciais principais que iniciam a partir de .BAT scripts. Para usar um deles como exemplo, posso iniciá-lo com o comando standalone , mesmo que não haja standalone.exe ..., em vez disso, ele tem um standalone.bat .

Algumas das extensões que tenho sobre o PATHEXT que estou a ver neste momento nunca foram utilizadas por uma aplicação. As que eu tenho executam muito mais comumente (mas obviamente não tanto quanto exe ) são: .com , .bat , .vbs , .js , .jar . Os dois primeiros são arquivos de script de lote do Windows e os outros três são tipos de arquivo para linguagens de programação específicas executadas a partir de scripts ou máquinas virtuais em vez de exe s (respectivamente: visual basic, javascript e java).

    
por 24.08.2018 / 02:13
0

start winword não informa ao prompt de comando para iniciar winword . Ele informa ao prompt de comando para iniciar o start com o argumento winword . Start usa seus próprios métodos para encontrar winword .

Apenas winword informa ao prompt de comando para iniciar winword . E se você tentar isso, já que winword não está no PATH , ele não será iniciado.

    
por 26.08.2018 / 17:43