Como atualizar a variável de ambiente do usuário PATH na linha de comando

12

Eu tenho uma variável PATH do sistema com a configuração no nível do sistema. Eu uso a variável PATH do usuário para complementar o PATH com a configuração específica do usuário.

Gostaria de atualizar a variável PATH do usuário na linha de comando, por exemplo, com setx.

Mas não sei como referenciar o caminho do usuário existente no setx.

No seguinte comando (setx sem / M)

setx PATH c:\my-user-specifc-bin-path;%PATH%

o primeiro PATH significa o caminho do usuário, mas o segundo% PATH% será substituído pelo caminho "completo" (usuário + sistema).

Então isso significa que todo o caminho do sistema seria duplicado no PATH do usuário ... o que definitivamente não é o que eu quero.

Eu gostaria de:

  • Afeta apenas a variável de ambiente PATH do usuário
  • Anexar / Anexar um ou mais elementos do caminho ao valor existente
  • Faça isso na linha de comando.
Christian Lemer
fonte
Parece-me que, quando você usa, ;%PATH%está solicitando que o caminho existente (derivado do caminho do sistema) seja anexado.
Daniel R Hicks

Respostas:

3

Versão do PowerShell, defina PATH para o usuário:

  1. Defina o novo PATH (substituir) para o usuário atual:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "C:\MyPath1"
  1. Defina anexar ao PATH do usuário atual:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "$((Get-ItemProperty -path HKCU:\Environment\ -Name Path).Path);C:\MyPath1"
  1. Defina o prefpend como PATH do usuário atual:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "C:\MyPath1;$((Get-ItemProperty -path HKCU:\Environment\ -Name Path).Path)"
Tho Ho
fonte
12

Para definir o PATH do usuário substituindo qualquer valor anterior:

setx PATH "C:\MyPath1"

Para acrescentar um valor "C: \ MyPath0" ao PATH do usuário existente:

for /f "skip=2 tokens=3*" %a in ('reg query HKCU\Environment /v PATH') do @if [%b]==[] ( @setx PATH "C:\MyPath0;%~a" ) else ( @setx PATH "C:\MyPath0;%~a %~b" )

Para acrescentar um valor "C: \ MyPath2" ao PATH do Usuário existente:

for /f "skip=2 tokens=3*" %a in ('reg query HKCU\Environment /v PATH') do @if [%b]==[] ( @setx PATH "%~a;C:\MyPath2" ) else ( @setx PATH "%~a %~b;C:\MyPath2" )

A condição if-else é necessária porque o PATH do usuário pode ou não conter espaços. Se desejar, você pode salvar os comandos como arquivos em lote genéricos (certifique-se de duplicar cada sinal de%) que aceitam o valor a ser definido / anexado / anexado como argumento.

Arquivo em lote

:: PATH-ADD - add a path to user path environment variable

@echo off
setlocal

:: set user path
set ok=0
for /f "skip=2 tokens=3*" %%a in ('reg query HKCU\Environment /v PATH') do if [%%b]==[] ( setx PATH "%%~a;%1" && set ok=1 ) else ( setx PATH "%%~a %%~b;%1" && set ok=1 )
if "%ok%" == "0" setx PATH "%1"

:end
endlocal
echo.
Karan
fonte
1
é necessária mais explicação. o que é% a, o que é% b?
precisa saber é o seguinte
Infelizmente, não funcionará se o usuário PATH ainda não estiver definido :(
nowox 13/01/15
@KJK: for /?dirá tudo o que você precisa saber. :) Eu não queria replicar tudo aqui desnecessariamente e pensei que seria fácil descobrir informações de qualquer maneira.
Karan
O código não verifica se o usuário PATH já termina com um ponto e vírgula; nesse caso, o diretório passado anexado deve ser feito sem um ponto e vírgula adicional. Mas o maior problema com esse código é a corrupção do usuário PATH se a cadeia de caracteres tiver mais de 1024 caracteres devido ao setx truncamento da cadeia para 1024 caracteres, exibindo as informações apropriadas antes de adicioná-las ao registro do Windows. Portanto, pode acontecer que, em vez de anexar o diretório passado, o usuário existente PATHseja truncado (ilegível) por esse código.
Mofi
4

necessário SETX /M, padrão SETXdefinido comoHKEY_CURRENT_USER

SETX /M PATH c:\my-bin-path;%PATH%
STTR
fonte
Isso afeta a variável PATH do sistema ... talvez meu exemplo tenha sido enganador, mas gostaria de atualizar a variável PATH do usuário especificamente.
Christian Lemer
@Chris op111.net/82
STTR
1

Isso parece funcionar:

setx PATH "c:\my-user-specifc-bin-path-which-may-contain-spaces;"%%PATH%%
rsphillips
fonte
É absolutamente NUNCA, NUNCA NUNCA atualizar usuário ou sistema PATH usando local PATH . Essa linha de comando realmente corrompe o usuário PATH adicionando ao registro do Windows para o usuário PATH a string c:\my-user-specifc-bin-path-which-may-contain-spaces;%C:\Windows\System32;C:\Windows;C:\Windows\System32\wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;%na melhor das hipóteses. Todos que usam essa linha de comando corromperam com êxito a configuração do usuário PATH e, portanto, local, PATH conforme usado por todos os processos em execução com a conta de usuário atual após a reinicialização do Windows ou o logoff / logon.
Mofi