Defina uma variável de ambiente persistente em cmd.exe


123

Tenho que definir variáveis ​​de ambiente em diferentes máquinas com Windows, mas não quero me incomodar em alterá-las manualmente acessando a tela de propriedades de "Meu Computador"

Quero fazer isso na linha de comando, com um arquivo em lote. Pelo que eu entendi, usar set mudará apenas a variável para os processos que chamarei na janela de comando.

Eu quero defini-lo definitivamente, então mais tarde, ao executar um novo processo, ele usará as novas configurações que defini. Existe uma maneira de fazer isso na linha de comando?


Qual é o ponto de defini-los na linha de comando se eles se tornarem permanentes? Você não precisará fazer isso de novo.
d-live

12
Sim, mas tenho que fazer isso em vários computadores, portanto, a execução do script vai me poupar algum tempo.
Arthur

2
Ok, nesse caso você pode definir seu env em um computador e fazer uma exportação das entradas descritas abaixo e ter um arquivo .reg, se SETX não estiver disponível para você.
d-live

Foi o que fiz. Obrigado.
Arthur

1
RE: 'Qual é o objetivo de configurá-los na linha de comando ...' Onde eu trabalho, há um requisito constante para uma série de variáveis ​​ambientais persistentes com valores diferentes, a fim de testar / desenvolver diferentes versões do software. O licenciamento significa que não pode ser feito de outra maneira (por exemplo, executando uma VM), então nosso único recurso é usar SETX em um script de lote. Usar .reg é menos bom, pois é mais difícil documentar / ver exatamente o que está acontecendo
Tony Eastwood

Respostas:


189

Use o comando SETX (observe o sufixo 'x') para definir variáveis ​​que persistem após o fechamento da janela cmd.

Por exemplo, para definir um env var "foo" com valor de "bar":

setx foo bar

Embora valha a pena ler as 'notas' que são exibidas se você imprimir o uso ( setx /?), em particular:

2) Em um sistema local, as variáveis ​​criadas ou modificadas por esta ferramenta estarão disponíveis em janelas de comando futuras, mas não na janela de comando CMD.exe atual.

3) Em um sistema remoto, as variáveis ​​criadas ou modificadas por esta ferramenta estarão disponíveis na próxima sessão de logon.

No PowerShell, o comando [Environment] :: SetEnvironmentVariable .


Parece que SETX está disponível apenas no Windows XP SP2
Arthur

2
Funcionou no Windows 7 para mim. Qual versão do windows você está usando?
Vik David

@jules: Você pode obtê-lo no Resource Kit, então.
Joey

46
Tome cuidado com o SETX, ele trunca seu comprimento variável para 1024 caracteres ... muito perigoso ao manipular% path%.
Etienne Desgagné

2
com o Power Shell, você pode simplesmente [Environment]::SetEnvironmentVariable('PATH', "Whatever you need it to be", "Machine")ver msdn.microsoft.com/en-us/library/96xafkes(v=vs.110).aspx
Gradient

21

A documentação do MSDN para variáveis ​​de ambiente informa o que fazer:

Para adicionar ou modificar programaticamente as variáveis ​​de ambiente do sistema, adicione-as à chave de registro HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environment e, em seguida, transmita uma mensagem WM_SETTINGCHANGE com lParam definido para a string "Environment". Isso permite que aplicativos, como o shell, captem suas atualizações.

Obviamente, você precisará de direitos de administrador para fazer isso. Não conheço nenhuma maneira de transmitir uma mensagem do Windows em lote do Windows, então você precisará escrever um pequeno programa para fazer isso.


1
Ok, considerando sua solução, criei um arquivo de registro (.reg) contendo as variáveis ​​de ambiente que desejo adicionar / alterar. Em seguida, executarei esse arquivo em todos os PCs de destino. Eu realmente não preciso enviar uma mensagem do Windows, pois irei apenas reiniciar o aplicativo que será afetado. Obrigado.
Arthur

1
Estou adicionando sua outra resposta aqui, pois era exatamente o que eu estava procurando quando me deparei com esta pergunta: stackoverflow.com/a/19705691/3543437
kayleeFrye_onDeck

1
@David, então por que não setxpor abaixo?
Pacerier

Acho que este reg tem a vantagem de não truncar e não ser
powerhell

2
' SetVar.vbs
Sub sety(wsh, action, typey, vary, value)
  Dim wu
  Set wu = wsh.Environment(typey)
  wui = wu.Item(vary)
  Select Case action
    Case "ls"
      WScript.Echo wui
    Case "del"
      On Error Resume Next
      wu.remove(vary)
      On Error Goto 0
    Case "set"
      wu.Item(vary) = value
    Case "add"
      If wui = "" Then
        wu.Item(vary) = value
      ElseIf InStr(UCase(";" & wui & ";"), UCase(";" & value & ";")) = 0 Then
        wu.Item(vary) = value & ";" & wui
      End If
    Case Else
      WScript.Echo "Bad action"
  End Select
End Sub

Dim wsh, args
Set wsh = WScript.CreateObject("WScript.Shell")
Set args = WScript.Arguments
Select Case WScript.Arguments.Length
  Case 3
    value = ""
  Case 4
    value = args(3)
  Case Else
    WScript.Echo "Arguments - 0: ls,del,set,add; 1: user,system, 2: variable; 3: value"
    value = "```"
End Select
If Not value = "```" Then
  ' 0: ls,del,set,add; 1: user,system, 2: variable; 3: value
  sety wsh, args(0), args(1), UCase(args(2)), value
End If

21
Você deve considerar adicionar algum contexto ou uma explicação para acompanhar seu código.
adamdunson

1
Poderoso pedaço de código +1. Funciona no XP sem setx(e sem possibilidade de instalá-lo). Uso simples (no meu caso):wsh.Environment("user").Item("myVar") = "my value"
Marek

2
Uma vez que ninguém se deu ao trabalho de usar no XP (nenhum Resource Kit ou setx necessário), para realizar {set foo = bar} para todas as (outras) janelas DOS: 1. salve o código acima como SetVar.vbs 2. setvar. vbs set system foo "bar" Nota, a janela DOS atual não obtém FOO a partir disso. Problema definido foo = bar para conseguir isso
MicrosoftShouldBeKickedInNuts

2
Observe também que sobrevive à reinicialização (quando você usa o parâmetro do sistema)
MicrosoftShouldBeKickedInNuts

1

Na verdade, SET TEST_VARIABLE = value funciona apenas para o processo atual, por isso SETXé obrigatório. Um exemplo rápido para armazenar permanentemente uma variável de ambiente no nível do usuário.

  1. Em cmd SETX TEST_VARIABLE etc,. Ainda não aplicado ( echo %TEST_VARIABLE%programas%TEST_VARIABLE% ,
  2. Verificação rápida: cmd aberto, echo %TEST_VARIABLE%showsetc .
  3. Verificação da GUI: Propriedades do sistema -> Avançado -> Variáveis ​​de ambiente -> Variáveis ​​de usuário para -> você deve ver Varible TEST_VARIABLE com valor etc.

0
:: Sets environment variables for both the current `cmd` window 
::   and/or other applications going forward.
:: I call this file keyz.cmd to be able to just type `keyz` at the prompt 
::   after changes because the word `keys` is already taken in Windows.

@echo off

:: set for the current window
set APCA_API_KEY_ID=key_id
set APCA_API_SECRET_KEY=secret_key
set APCA_API_BASE_URL=https://paper-api.alpaca.markets

:: setx also for other windows and processes going forward
setx APCA_API_KEY_ID     %APCA_API_KEY_ID%
setx APCA_API_SECRET_KEY %APCA_API_SECRET_KEY%
setx APCA_API_BASE_URL   %APCA_API_BASE_URL%

:: Displaying what was just set.
set apca

:: Or for copy/paste manually ...
:: setx APCA_API_KEY_ID     'key_id'
:: setx APCA_API_SECRET_KEY 'secret_key'
:: setx APCA_API_BASE_URL   'https://paper-api.alpaca.markets'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.