Eu descobri que a configuração da variável de ambiente PATH afeta apenas o prompt de comando antigo. O PowerShell parece ter diferentes configurações de ambiente. Como altero as variáveis de ambiente do PowerShell (v1)?
Nota:
Quero tornar minhas alterações permanentes, para não precisar defini-las sempre que executar o PowerShell. O PowerShell tem um arquivo de perfil? Algo como o perfil do Bash no Unix?
windows
powershell
Vasil
fonte
fonte
"
) na variável de ambiente do caminho$($Env:PATH).Split(';') | %{ $str += "$($_.Trim('"'));" }; $Env:PATH=$str
Respostas:
A alteração das variáveis de ambiente reais pode ser feita usando as
env: namespace / drive
informações. Por exemplo, este código atualizará a variável de ambiente do caminho:Existem maneiras de tornar as configurações do ambiente permanentes, mas se você as estiver usando apenas no PowerShell, provavelmente será muito melhor usar seu perfil para iniciar as configurações. Na inicialização, o PowerShell executará os arquivos .ps1 encontrados no
WindowsPowerShell
diretório, na pasta Meus Documentos. Normalmente você já possui um arquivo profile.ps1 . O caminho no meu computador éfonte
C:\path\to\file.ext
às variáveis de ambiente? EDIT: já encontrou. A resposta é sim, crie-a. O arquivo deve consistir de 1 linha:$env:path += ;C:\path\to\file.ext"
.$env:Path = "SomeRandomPath";
Em vez disso, consulte @mloskot, abaixo.Se, em algum momento durante uma sessão do PowerShell, você precisar anexar temporariamente à variável de ambiente PATH, poderá fazer o seguinte:
fonte
$env:Path = "C:\MyPath;$env:Path"
Você também pode modificar as variáveis de ambiente do usuário / sistema permanentemente (ou seja, será persistente nas reinicializações do shell) com o seguinte:
Modifique uma variável de ambiente do sistema
Modifique uma variável de ambiente do usuário
Uso dos comentários - adicione à variável de ambiente do sistema
A solução baseada em string também é possível se você não quiser escrever tipos
fonte
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", [EnvironmentVariableTartget::Machine)
Você não verá o resultado dessa alteração até iniciar uma nova sessão do PowerShell. Ou seja, se você inspecionar $ env: Path imediatamente após executar este comando, verá o que $ env: Path estava antes do comando. Para atualizar, feche e abra o shell ou inicie uma nova sessão.[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";C:\bin", "User")
No prompt do PowerShell:
Você deve ver o texto:
Reinicie sua sessão e a variável estará disponível.
setx
também pode ser usado para definir variáveis arbitrárias. Digitesetx /?
no prompt da documentação.Antes de mexer com o caminho dessa maneira, salve uma cópia do caminho existente, fazendo isso
$env:path >> a.out
em um prompt do PowerShell.fonte
$env:PATH
primeiro e depoissetx /m PATH "$env:PATH"
aplicar local e globalmente sem a reinicialização do shell?Como a resposta de JeanT , eu queria uma abstração em torno de adicionar ao caminho. Diferentemente da resposta do JeanT, eu precisava que ele fosse executado sem a interação do usuário. Outro comportamento que eu estava procurando:
$env:Path
para que a alteração entre em vigor na sessão atualCaso seja útil, aqui está:
Confira minha essência para a
Remove-EnvPath
função correspondente .fonte
Embora a resposta aceita atualmente funcione no sentido de que a variável path é permanentemente atualizada no contexto do PowerShell, na verdade, ela não atualiza a variável de ambiente armazenada no registro do Windows.
Para conseguir isso, obviamente você também pode usar o PowerShell:
Mais informações estão na postagem do blog Use o PowerShell para modificar seu caminho ambiental
Se você usar extensões da comunidade do PowerShell, o comando apropriado para adicionar um caminho ao caminho da variável de ambiente é:
fonte
Todas as respostas que sugerem uma alteração permanente têm o mesmo problema: Eles quebram o valor do registro do caminho.
SetEnvironmentVariable
transforma oREG_EXPAND_SZ
valor%SystemRoot%\system32
em umREG_SZ
valor deC:\Windows\system32
.Quaisquer outras variáveis no caminho também são perdidas. Adicionar novos usando
%myNewPath%
não funcionará mais.Aqui está um script
Set-PathVariable.ps1
que eu uso para solucionar esse problema:Eu explico o problema com mais detalhes em uma postagem no blog .
fonte
Isso define o caminho da sessão atual e solicita que o usuário a adicione permanentemente:
Você pode adicionar esta função ao seu perfil padrão (
Microsoft.PowerShell_profile.ps1
), geralmente localizado em%USERPROFILE%\Documents\WindowsPowerShell
.fonte
Com base na resposta de @Michael Kropat, adicionei um parâmetro para preceder o novo caminho na
PATH
variável existente e uma verificação para evitar a adição de um caminho inexistente:fonte
Como Jonathan Leaders mencionou aqui , é importante executar o comando / script elevado para poder alterar variáveis de ambiente para 'machine' , mas a execução de alguns comandos elevados não precisa ser feita com as extensões da comunidade, então eu gostaria para modificar e estender a resposta de JeanT de uma maneira, essas variáveis de máquina em mudança também podem ser executadas mesmo se o próprio script não for executado elevado:
fonte
A maioria das respostas não está abordando o UAC . Isso cobre problemas de UAC.
Primeiro instale as extensões de comunidade do PowerShell:
choco install pscx
via http://chocolatey.org/ (pode ser necessário reiniciar o ambiente do shell).Em seguida, ative o pscx
Então use
Invoke-Elevated
fonte
Minha sugestão é esta:
Eu testei isso para adicionar
C:\oracle\x64\bin
à variável de ambientePath
permanentemente e isso funciona bem.A primeira maneira é simplesmente fazer:
Mas essa mudança não é permanente.
$env:path
voltará ao padrão anterior, assim que você fechar o terminal do PowerShell e reabri-lo novamente. Isso ocorre porque você aplicou a alteração no nível da sessão e não no nível de origem (que é o nível do registro). Para visualizar o valor global de$env:path
, faça:Ou mais especificamente:
Agora, para mudar isso, primeiro capturamos o caminho original que precisa ser modificado:
Agora, definimos como deve ser o novo caminho. Nesse caso, anexamos uma nova pasta:
Nota: Certifique-se de que tenha a
$newpath
aparência que deseja. Caso contrário, você pode danificar seu sistema operacional.Agora aplique o novo valor:
Agora, faça uma verificação final da aparência que você espera:
Agora você pode reiniciar o terminal do PowerShell (ou até mesmo reiniciar o computador) e verificar se ele não reverte novamente para o valor antigo.
Observe que a ordem dos caminhos pode mudar, de modo que esteja em ordem alfabética; portanto, verifique a linha inteira. Para facilitar, você pode dividir a saída em linhas usando o ponto e vírgula como um delimitador:
fonte
Abra o PowerShell e execute:
fonte
No PowerShell, é possível navegar para o diretório de variáveis de ambiente digitando:
Isso o levará ao diretório Env:>. De dentro deste diretório:
Para ver todas as variáveis de ambiente, digite:
Para ver uma variável de ambiente específica, digite:
Para definir uma variável de ambiente, digite:
Para remover uma variável de ambiente, digite:
Mais informações estão em Sobre variáveis de ambiente .
fonte
Tentei otimizar um pouco o código da SBF e do Michael para torná-lo mais compacto.
Estou confiando na coerção de tipos do PowerShell, na qual ele converte automaticamente as seqüências de caracteres em valores de enumeração, então não defini o dicionário de pesquisa.
Também retirei o bloco que adiciona o novo caminho à lista com base em uma condição, para que o trabalho seja feito uma vez e armazenado em uma variável para reutilização.
Em seguida, é aplicado permanentemente ou apenas na sessão, dependendo do
$PathContainer
parâmetro.Podemos colocar o bloco de código em uma função ou em um arquivo ps1 que chamamos diretamente no prompt de comando. Eu fui com DevEnvAddPath.ps1.
Eu faço algo semelhante para um DevEnvRemovePath.ps1.
Até agora, eles parecem funcionar.
fonte
Somente as respostas que colocam o valor no registro afetam uma alteração permanente (portanto, a maioria das respostas nesse segmento, incluindo a resposta aceita, não afeta permanentemente o
Path
).A função a seguir funciona para os tipos
Path
/PSModulePath
eUser
/System
. Ele também adicionará o novo caminho à sessão atual por padrão.fonte