O prompt de comando do Windows procura em algum lugar que não seja o local especificado pela variável PATH ao iniciar os aplicativos?

35

Eu tentei o seguinte experimento.

Antes de começar, verifiquei a variável PATH no cmd, que possui 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 Server\110\Tools\Binn\;C:\Program Files\Microsoft SQL Server\120\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\;

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

start winword

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

Concluí, portanto, que o prompt de comando deve saber pesquisar 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 em que o arquivo executável 'winword' está localizado. Acontece que o winword.exe está localizado aqui:

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

Portanto, dando-me a ideia de que talvez o CMD procure automaticamente através de ProgramFiles e ProgramFiles (x86) (e todos os subdiretórios) ao executar o comando 'start'? O que me levou a tentar iniciar 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 iniciado quando digitei:

start audacity

na linha de comando.

insira a descrição da imagem aqui

Adicionei o diretório que contém o audacity.exe ao PATH:

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

Depois disso, tentei iniciar o Audacity novamente:

start audacity

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

O que eu quero saber é onde exatamente o prompt de comando procura por executáveis? Por que o winword.exe é iniciado mesmo quando o diretório que o contém não faz parte do PATH, mas o mesmo não se aplica ao audacity.exe?

Eu tentei outras aplicações também. Chrome e Firefox funcionam quando eu uso o comando start.

ATUALIZAÇÃO: Estou executando o Windows versão 6.3.9600 (Windows 8.1)

Anthony
fonte

Respostas:

44

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

O motivo winword.exefoi que existe uma chave do Registro que define o caminho para o Microsoft Word (Winword.exe). Uma chave semelhante existe para 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

O que eu quero saber é onde exatamente o prompt de comando procura por executáveis?

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

Quando a função ShellExecuteEx é chamada com o nome de um arquivo executável em seu parâmetro lpFile, há vários locais em que a função procura o arquivo. Recomendamos registrar seu aplicativo na subchave do Registro App Paths. Isso evita a necessidade de aplicativos modificarem a variável de ambiente PATH do sistema.

  • O diretório de trabalho atual.
  • Somente o diretório do Windows (nenhum subdiretório é pesquisado).
  • O diretório Windows \ System32.
  • Diretórios listados na variável de ambiente PATH.
  • Recomendado: Caminhos HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ App

Fonte: Registro do Aplicativo

Ramhound
fonte
15

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

Se você digitar, START WinWordele será executado.

O Startcomando é a chave aqui.

Quando você tenta executar um arquivo através do comando start, o Prompt de Comando não realiza 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 procurar o local do arquivo. Existem vários locais que ele pesquisa na seguinte ordem:

  • O diretório de trabalho atual.

  • O Windowsdiretório somente (não subdiretórios são pesquisados).

  • O Windows\System32diretório

  • Diretórios listados na PATHvariável de ambiente.

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

WinWordestá nessa chave do registro. A chave está lá para não PATHficar muito tempo.

Larryc
fonte
7
Cite e cite todas as fontes. A menos que você tenha escrito a ordem de pesquisa a partir da memória, deveria ter citado sua fonte, que indica a lista e a ordem em que é pesquisada.
Ramhound 23/08/18
A fonte seria minhas anotações de algo que eu estava trabalhando há alguns anos atrás. Não sei onde o peguei naquela época, as páginas da web vêm e vão.
Larryc
5
Você os obteve da mesma documentação de todos os outros.
Ramhound 23/08/18
7

O programa (quando você especifica o nome do módulo sem unidade / 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 seu hardlink / softlink / atalho com o mesmo nome)

  • por DOSKEY alias

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

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.execom o valor padrão de C:\Program Files (x86)\Audacity\Audacity.exee iniciar esse aplicativo simplesmente digitando start auno prompt de comando.

Akina
fonte
0

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

Você disse especificamente que estava procurando 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 ao executar um comando é a variável PATHEXT. Esta é uma ;lista delimitada de extensões de arquivo para tentar executar. Se você ecoar, PATHEXTpoderá ver algo como .COM;.EXE;.BAT;.CMD;.VBS;... (etc.). Alguns aplicativos usam esses outros tipos de arquivos como ponto de entrada do usuário final. É muito menos comum, mas acontece. Eu usei vários produtos comerciais importantes que começam com .BATscripts. Para usar um deles como exemplo, eu posso iniciá-lo com o comando standalonemesmo que não exista standalone.exe... em vez disso, ele possui a standalone.bat.

Algumas das extensões que tenho no PATHEXTmomento, nunca tive o uso de um aplicativo. Os que eu ter executado em muito mais frequentemente (mas, obviamente, não tanto quanto exe) são: .com, .bat, .vbs, .js, .jar. Os dois primeiros são arquivos de script em lote do Windows e os outros três são tipos de arquivos para linguagens de programação específicas executadas a partir de scripts ou máquinas virtuais em vez de exes (respectivamente: visual basic, javascript e java).

Loduwijk
fonte
Os eleitores que se recusam a comentar (sei que geralmente é inútil perguntar, mas às vezes recebo uma resposta)? Eu cometi um erro em algum lugar?
Loduwijk
Não eu, mas em um palpite selvagem, é porque enquanto PATHEXTe PATH, ambos estão relacionados a fazer as coisas funcionarem, eles são um tanto ortogonais em suas respectivas tarefas. PATHespecifica onde procurar as coisas a serem executadas e é o que o OP estava perguntando, enquanto PATHEXTespecifica o que pode ser executado.
precisa saber é
@dgnuff Interessante, já que esse era o meu ponto: o OP formulou a pergunta especificamente de uma maneira que implorava por um desafio de quadro ... nos termos do SE, eles estavam fazendo uma "pergunta XY" ao assumir que o arquivo sendo executado não era nos lugares que já estavam sendo pesquisados ​​no caminho. De qualquer forma, obrigado.
Loduwijk
0

start winwordnão diz ao prompt de comando para iniciar winword. Diz ao prompt de comando para iniciar startcom argumento winword. Startusa seus próprios métodos para encontrar winword.

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

Eric Towers
fonte