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

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

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

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



답변

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

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

setx foo bar

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

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

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

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


답변

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

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

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


답변

' 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


답변

실제로 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.

답변

:: 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'


답변