Por que sou capaz de executar um programa que não está na minha variável de ambiente PATH?

9

Fiquei me perguntando por que o comando java -versioné acessível globalmente ?

Eu poderia executá-lo a partir de qualquer diretório e seu trabalho:

insira a descrição da imagem aqui

Como funciona?

É assim que minha PATHvariável de sistema se parece:

C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;
%SystemRoot%\system32;
%SystemRoot%;
%SystemRoot%\System32\Wbem;
%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\

Quanto a mim, java.exeestá localizado em%programfiles%\java\jre7\bin

Pacerier
fonte
2
Veja aqui .
Daniel Beck
Eu não tenho os detalhes em mãos no momento, e é por isso que este é um comentário e não uma resposta, mas se java.exe(ou java.cometc) não estiver no seu, PATHexiste outra entrada de registro que pode especificar caminhos executáveis.
Mark Hurd
11
O @MarkHurd cmd (e CreateProcess) não examina a entrada do Registro App Paths, apenas o ShellExecute [e, portanto, a caixa de diálogo Executar] o faz.
usar o seguinte comando
@MarkHurd, como você espera, é não no meu caminho variável ..
Pacerier
11
@Pacerier O executável java é encontrado em% SystemRoot% \ System32 \
Dwayne Hinterlang

Respostas:

13

Normalmente, há um grupo de diretórios nos quais os arquivos executáveis ​​usados ​​repetidamente são encontrados pelo Windows, mas, na prática, não há motivo específico para usar um comando como global ou não. Os desenvolvedores costumavam incluí-lo como "global" onde quer que eles quisessem; eles eram livres para fazê-lo. Se você deseja usar qualquer comando como "global", precisará adicioná-lo como uma "Variável de ambiente do Windows" . Para fazer isso, você pode usar os seguintes métodos :

  1. Adicionando manualmente com "Propriedades do sistema Windows": insira a descrição da imagem aqui

  2. Usando a ferramenta complementar Setx.exe:

Não faz parte da instalação padrão do Windows XP, mas uma ferramenta de linha de comando chamada setx.exe está incluída nas Ferramentas de Suporte do Windows XP Service Pack 2. Essa ferramenta estende o comando set para que alterações permanentes nas variáveis ​​de ambiente possam ser feitas. Por exemplo, para adicionar uma pasta C: \ Nova Pasta ao caminho, o comando seria

setx path "%PATH%;C:\New Folder" 
  1. Scripts para Listar Variáveis ​​de Ambiente:

O comando "Set" pode ser usado em um prompt de comando junto com um redirecionamento para um arquivo de texto para fazer uma lista das variáveis ​​de ambiente atuais. O comando pode ser

set > C:\env_list.txt 

O nome do arquivo "C: \ env_list.txt" pode ser substituído por qualquer um de sua escolha.

A Microsoft também possui um VBScript que lista variáveis ​​de ambiente nesta página .

  1. Chaves do Registro para variáveis ​​de ambiente:

Para quem tem experiência na edição do Registro, há outra maneira de fazer alterações nas variáveis ​​de ambiente. As variáveis ​​de ambiente do usuário são armazenadas no Registro na chave:

HKEY_CURRENT_USER\Environment

As variáveis ​​do sistema são encontradas na chave:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

Observe que qualquer variável de ambiente que esteja no formato que precise ser expandida (por exemplo,% PATH%) deve ser armazenada no registro como um valor de registro REG_EXPAND_SZ. A edição do Registro é principalmente para scripts usados ​​pelos administradores de sistemas e não é recomendada para o usuário médio do PC.

Você pode encontrar mais informações sobre isso aqui.

Diogo
fonte
11
No entanto, java.exe está localizado em %programfiles%\java\jre7\bin. Esta pasta não aparecer na variável PATH do meu sistema ..
Pacerier
7
Java.exe também é encontrada em% SystemRoot% \ System32 \ que não aparecem na sua variável PATH
Dwayne Hinterlang
5

Os "comandos globais" são determinados pelas suas variáveis ​​de ambiente.

Dependendo do sistema operacional que você está usando, para configurá-lo é bem diferente.

A maneira mais genérica é por

Clique com o botão direito em "Meu Computador" e selecione "Propriedades".

No Windows7, você terá que selecionar "Configurações avançadas do sistema" no painel à esquerda.

Depois de abrir a caixa de diálogo Propriedades do sistema, selecione a guia "Avançado".

Na parte inferior, há um botão "Variáveis ​​de ambiente"

No diálogo Variáveis ​​de ambiente, você poderá configurar variáveis ​​de ambiente por usuário ou para todo o sistema.

Por exemplo, a variável de sistema "Caminho" simplificada ficaria assim:

C: \ Arquivos de programas \ Java \ jre6 \ bin ; C: \ Ruby19 \ bin;

Os executáveis ​​nesses caminhos podem ser chamados diretamente da Linha de Comando.

O motivo pelo qual você pode chamar todos calc, mspaint, cmd no diálogo Executar é porque C: \ windows \ system32 está na variável de ambiente Path.

Você pode adicionar caminhos personalizados às variáveis ​​ambientais, tomando cuidado para não substituir o existente e separar os caminhos usando um ponto e vírgula. ";"

Você pode executar um executável a partir desse caminho diretamente na linha de comando sem digitar o caminho inteiro, como o comando java -version.

Para mais informações, consulte os seguintes links ...

variáveis ​​ambientais

Compreender e configurar variáveis ​​de ambiente

Pesquisa Java.exe em uma nova instalação

Dwayne Hinterlang
fonte
3

Aqui está um simples whichque exibe todas as ocorrências de comando no PATH para as extensões PATHEXT atuais:

@for %%I in ("%path:;=\" "%") do @for %%E in (%pathext:;= %) do @if exist "%%~dpI%1%%E" @echo %%~dpI%1%%E

Coloque isso where.cmd(permitindo whichvir de outro lugar, se você conseguir!) E ligue com ele where java.

Agora, no meu comentário acima, sugeri que se javafaz não aparecem no seu PATH, você pode verificar em HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths [ref] , mas depois realmente tentando isso, ele não funciona com a linha de comando, apenas com as coisas que o uso ShellExecuteEx, como em Iniciar, Executar e o startcomando da CLI.

Mark Hurd
fonte
2

Quando você insere um comando, o shell analisa uma variável de ambiente chamada PATH (% PATH%, $ PATH, dependendo do SO). Ele consulta todos os diretórios no PATH para ver se encontra um executável que corresponde ao comando que você digitou. O primeiro que encontrar será executado.

Veja outras respostas para algumas das várias maneiras de definir a variável PATH.

Dennis S.
fonte