cmd.exe에서 영구 환경 변수 설정


123

다른 Windows 시스템에서 환경 변수를 설정해야하는데 "내 컴퓨터"의 속성 화면에서 수동으로 변경하는 것을 귀찮게하고 싶지 않습니다.

배치 파일을 사용하여 명령 줄에서 수행하고 싶습니다. 내가 이해하는 한, set을 사용하면 명령 창에서 호출 할 프로세스의 변수 만 변경됩니다.

확실히 설정하고 싶기 때문에 나중에 새 프로세스를 실행할 때 내가 설정 한 새 설정을 사용합니다. 명령 줄에서 수행하는 방법이 있습니까?


영구적 인 경우 명령 줄에서 설정하는 요점은 무엇입니까? 다시 할 필요가 없습니다.
d-live

12
예,하지만 여러 대의 컴퓨터에서해야하므로 스크립트를 실행하면 시간이 절약됩니다.
Arthur

2
좋습니다.이 경우 한 컴퓨터에서 환경을 설정하고 아래에 설명 된 항목을 내보내고 SETX를 사용할 수없는 경우 .reg 파일을 가질 수 있습니다.
d-live

그게 내가 한 일입니다. 감사.
Arthur

1
RE : '명령 줄에서 설정하는 요점은 ...'제가 작업하는 곳에서는 다양한 버전의 소프트웨어를 테스트 / 개발하기 위해 다양한 값에 대한 지속적인 환경 변수가 필요합니다. 라이선스는 다른 방법 (예 : VM 실행)이 불가능하므로 배치 스크립트에서 SETX를 사용하는 것이 유일한 방법입니다. 그 열심히 문서에 덜 좋은 .REG입니다 사용 / 정확하게에 무슨 일이야 참조
토니 이스트우드

답변:


189

cmd 창이 닫힌 후에도 지속되는 변수를 설정 하려면 SETX 명령 ( 'x'접미사 참고)을 사용하십시오.

예를 들어, 값이 "bar"인 env var "foo"를 설정하려면 :

setx foo bar

사용법 ( setx /?) 을 인쇄하면 표시되는 '참고'를 읽을 가치가 있지만 특히 다음과 같습니다.

2) 로컬 시스템에서이 도구로 생성하거나 수정 한 변수는 향후 명령 창에서 사용할 수 있지만 현재 CMD.exe 명령 창에서는 사용할 수 없습니다.

3) 원격 시스템에서이 도구로 만들거나 수정 한 변수는 다음 로그온 세션에서 사용할 수 있습니다.

PowerShell에서 [Environment] :: SetEnvironmentVariable 명령.


SETX는 Windows XP SP2에서만 사용할 수있는 것 같습니다
Arthur

2
나를 위해 Windows 7에서 작동했습니다. 사용중인 Windows 버전은 무엇입니까?
Vik David

@jules : 그러면 리소스 키트에서 얻을 수 있습니다.
Joey

45
SETX를 사용하면 변수 길이가 1024 자로 잘립니다. % path %를 조작 할 때 매우 위험합니다.
에티엔 느 Desgagné

2
Power Shell을 사용하면 다음을 [Environment]::SetEnvironmentVariable('PATH', "Whatever you need it to be", "Machine")참조하십시오. msdn.microsoft.com/en-us/library/96xafkes(v=vs.110).aspx
Gradient

21

환경 변수에 대한 MSDN 문서는 무엇을해야할지 알려줍니다 :

프로그래밍 방식으로 시스템 환경 변수를 추가하거나 수정하려면 HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environment 레지스트리 키에 추가 한 다음 lParam이 "Environment"문자열로 설정된 WM_SETTINGCHANGE 메시지 를 브로드 캐스트합니다 . 이를 통해 셸과 같은 응용 프로그램이 업데이트를 선택할 수 있습니다.

물론이 작업을 수행하려면 관리자 권한이 필요합니다. Windows 배치에서 Windows 메시지를 브로드 캐스트하는 방법을 알지 못하므로이 작업을 수행하려면 작은 프로그램을 작성해야합니다.


1
좋아, 솔루션을 고려하여 추가 / 변경하려는 환경 변수가 포함 된 레지스트리 (.reg) 파일을 만들었습니다. 그런 다음 모든 대상 PC에서이 파일을 실행합니다. 영향을받을 응용 프로그램을 다시 시작하기 때문에 Windows 메시지를 보낼 필요가 없습니다. 감사.
Arthur

1
그것이 내가이 질문을 우연히 때 내가 찾던 정확히이었다로 내가 여기에 다른 대답을 추가 해요 : stackoverflow.com/a/19705691/3543437
kayleeFrye_onDeck

1
@ 데이비드, 그럼 왜 안돼 setx?
Pacerier

이 reg는 잘리지 않고 powershell이 ​​아니라는 장점이 있다고 생각합니다
eri0o

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
코드와 함께 컨텍스트 또는 설명을 추가하는 것을 고려해야합니다.
adamdunson 2013 년

1
강력한 코드 +1. XP에서 작동합니다 setx(설치 가능성없이). 간단한 사용 (제 경우) :wsh.Environment("user").Item("myVar") = "my value"
Marek

2
아무도 문제를 겪지 않았기 때문에 XP에서 사용 (리소스 키트 또는 setx 필요 없음)하여 모든 (다른) DOS 창에 대해 {set foo = bar}를 수행하려면 : 1. 위 코드를 SetVar.vbs로 저장합니다. 2. setvar. vbs set system foo "bar"참고, 현재 DOS 창은 여기에서 FOO를 얻지 못합니다. 이를 달성하기 위해 set foo = bar 발행
MicrosoftShouldBeKickedInNuts

2
또한 재부팅 후에도 유지됩니다 (시스템 매개 변수를 사용할 때)
MicrosoftShouldBeKickedInNuts

1

실제로 SET TEST_VARIABLE = value는 현재 프로세스에서만 작동하므로 SETX필수입니다. 사용자 수준에서 환경 변수를 영구적으로 저장하는 간단한 예입니다.

  1. cmd에서 SETX TEST_VARIABLE etc. 되지 않음 (아직 적용 echo %TEST_VARIABLE%%TEST_VARIABLE%,
  2. 빠른 검사 : 개방 cmd를 echo %TEST_VARIABLE%보여줍니다 etc.
  3. GUI 확인 : 시스템 속성-> 고급-> 환경 변수-> 사용자 변수-> 값이있는 Varible TEST_VARIABLE이 표시되어야합니다 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'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.