OS 레벨 구성에서 환경 변수를 제거하는 명령 행


182

Windows에는 다음 setx명령이 있습니다.

Description:
    Creates or modifies environment variables in the user or system
    environment.

따라서 다음과 같이 변수를 설정할 수 있습니다.

setx FOOBAR 1

그리고 다음과 같이 값을 지울 수 있습니다.

setx FOOBAR ""

그러나 변수는 제거되지 않습니다. 레지스트리에 남아 있습니다.

foobar

그렇다면 실제로 변수를 어떻게 제거 하시겠습니까?


3
setx는 변수를 설정합니다. 당신은 그 줄로 그것을 비우고 있습니다.
폭스 윌슨


상당한 양의 파기가 필요했기 때문에 비 명령 행 옵션에 대해서는 superuser.com/q/297947/46834 를 참조하십시오 .
gary December

답변:


217

현재 환경 (에서 변수를 제거 하지 영구적으로) :

set FOOBAR=

사용자 환경 에서 변수를 영구적으로 제거하려면 (기본 위치 setx) :

REG delete HKCU\Environment /F /V FOOBAR

시스템 환경 에서 변수가 설정되어있는 경우 (예 : 원래로 설정 한 경우 setx /M) 관리자로 다음을 실행하십시오.

REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR

참고 : REG위 의 명령은 기존 프로세스 (및 기존 프로세스에서 분기 된 일부 새 프로세스)에 영향을 미치지 않으므로 변경 사항이 즉시 적용되는 것이 중요하다면 가장 쉽고 확실한 작업은 로그 아웃 한 후 다시 로그인하는 것입니다. 또는 재부팅하십시오. 이것이 옵션이 아니거나 더 깊이 파고 싶다면 여기에있는 다른 답변 중 일부는 사용 사례에 적합한 훌륭한 제안을 제공합니다.


1
이 솔루션이 작동하지 않는 것 같습니다. 또는 기본 사항을 오해하고 있습니다. 그렇습니다 setx JUNK Hello. 새 cmd를 엽니 다. 입력 echo %JUNK%하고 가져옵니다 Hello. 그런 다음 REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V JUNK레지스트리에서 값이 사라 졌음을 확인합니다. 새 cmd를 열고 입력 echo %JUNK%하고 여전히을 얻습니다 Hello. 레지스트리 검색시 'JUNK'가 없습니다. 재부팅이 필요하다고 말하지 마십시오!
caasjj

답장을 보내 주셔서 감사합니다. 시작 메뉴에서 새 명령 창을 열고 있습니다. 두 가지 버전의 명령을 시도했습니다. 실제로 user환경 명령을 처음 입력 하면 성공합니다. 그런 다음 명령을 다시 입력하면 얻을 수 The system was unable to find the specified registry or key value있습니다. 또한 JUNK레지스트리에서 전역 검색 하면 regedit아무 것도 나타나지 않습니다. 여전히 새 명령 창을 열고 (시작 / 액세서리 또는 실행의 cmd.exe를 통해)을 입력 echo %JUNK%하면 값이 여전히 있습니다!
caasjj

1
아! 합리적인 이유는 무엇입니까? 나는 항상 가능한 한 많은 관리자를 피합니다-UNIX / BSD / Linux 양육. 근면 한 성실에 감사드립니다. +1
caasjj

4
어쩌면 의미론 일 수도 있지만 레지스트리에서 삭제하면 즉시 적용됩니다. 다시 로그인 할 때까지 레지스트리에서 환경이 다시 초기화되지 않습니다. 두 명령을 결합하여 현재 환경에서 제거하고 ( SET다음 cmd 쉘 의 목록 에서 제거 ) 레지스트리에서 제거 할 수 있습니다. 예 :SETX FOOBAR "" & REG delete HKCU\Environment /F /V FOOBAR
Luke

1
다시 부팅하지 않고 환경이 업데이트되지 않는 이유는 explorer.exe가 업데이트되었음을 ​​알기 때문입니다. 자세한 설명과 솔루션은 내 답변을 참조하십시오.
Jamie

72

변수를 영구적으로 제거하지 않고 현재 명령 세션에서 변수를 제거하려면 일반 내장 set명령을 사용하십시오 . 등호 뒤에 아무것도 넣지 마십시오 .

set FOOBAR=

확인하려면 set인수없이 실행 하고 현재 환경을 확인하십시오. 변수가 목록에서 완전히 없어야합니다.

참고 : 현재 환경 에서만 변수가 제거 되며 레지스트리에 대한 변경 내용은 유지되지 않습니다. 새로운 명령 프로세스가 시작되면 변수가 다시 나타납니다.


77
이것은 분명히 답이 아니며, 너무 많은 투표를하는 것이 혼란 스럽습니다. 이것은 현재 명령 세션에만 유효합니다. 새 명령 창을 크랭크하면 var가 다시 나타납니다.
joescii

6
@joescii이 놀라운 것을 찾으십니까? 질문 제목의 질문에 답변했습니다. 따라서 질문 제목은보다 구체적이어야했습니다.
준수

10
@ oberlies 제목에있는 질문에 대답하지 않는 데 동의하지 않습니다 .OS 수준에서는 작동하지 않지만 현재 명령 창에서만 작동하기 때문입니다. 둘째, 요점은 질문의 세부 사항 부분이 관련이 없음을 나타냅니다.
joescii

3
@oberlies 불행히도 편집이 트릭을 수행하지 않은 것 같습니다-여전히 불쾌감을줍니다. 나는 사람들이 실제 질문에 대답하지 않더라도 유용하다고 생각합니다.이 경우 공감자가 가치가 있습니다 (그렇습니까?). 적어도 승인 된 것으로 표시되지 않아 오해의 소지가 있습니다.
CupawnTae

3
내가 왜 하향 투표를했는지 언급해야합니다. 분명히 이것은 현재 세션에서만 작동하기 때문입니다.
Ian Grainger

22

이것은 상당히 다루어졌지만 중요한 정보가 빠져 있습니다. 바라건대, 나는 이것이 어떻게 작동하는지 정리하고 지친 여행자에게 약간의 구호를 줄 수 있습니다. :-)

현재 프로세스에서 삭제

분명히 모든 사람은 현재 프로세스에서 환경 변수를 삭제하기 위해이 작업을 수행한다는 것을 알고 있습니다.

set FOO=

영구 삭제

시스템 전체와 사용자의 두 가지 환경 변수 세트가 있습니다.

사용자 환경 변수 삭제 :

reg delete "HKCU\Environment" /v FOO /f

시스템 전체 환경 변수 삭제 :

REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOO

재부팅하지 않고 값 적용

여기에 빠진 마술 정보가 있습니다! 왜 그렇게 한 후에 새 명령 창을 시작할 때 환경 변수가 여전히 있는지 궁금합니다. 그 이유는 explorer.exe가 환경을 업데이트하지 않았기 때문입니다. 한 프로세스가 다른 프로세스를 시작하면 새 프로세스는 프로세스를 시작한 프로세스에서 환경을 상속합니다.

재부팅하지 않고이 문제를 해결하는 방법에는 두 가지가 있습니다. 가장 무차별적인 방법은 explorer.exe 프로세스를 종료하고 다시 시작하는 것입니다. 작업 관리자 에서이를 수행 할 수 있습니다 . 그러나이 방법은 권장하지 않습니다.

다른 방법은 explorer.exe에 환경이 변경되었으며 다시 읽도록 알리는 것입니다. 이는 Windows 메시지 (WM_SETTINGCHANGE)를 브로드 캐스트하여 수행됩니다. 간단한 PowerShell 스크립트로이를 수행 할 수 있습니다. 이 작업을 쉽게 수행 할 수는 있지만 스크립트 변경 후 업데이트 창 설정 에서 하나를 찾을 수 있습니다 .

if (-not ("win32.nativemethods" -as [type])) {
    add-type -Namespace Win32 -Name NativeMethods -MemberDefinition @"
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern IntPtr SendMessageTimeout(
            IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam,
            uint fuFlags, uint uTimeout, out UIntPtr lpdwResult);
        "@
}

$HWND_BROADCAST = [intptr]0xffff;
$WM_SETTINGCHANGE = 0x1a;
$result = [uintptr]::zero

[win32.nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE,[uintptr]::Zero, "Environment", 2, 5000, [ref]$result);

요약

따라서 "FOO"라는 사용자 환경 변수를 삭제하고 나중에 실행하는 프로세스에 변경 사항을 반영하려면 다음을 수행하십시오.

  1. PowerShell 스크립트를 파일에 저장합니다 (updateenv.ps1이라고 함).
  2. 명령 행에서이를 수행하십시오. reg delete "HKCU \ Environment"/ v FOO / f
  3. updateenv.ps1을 실행하십시오.
  4. 명령 프롬프트를 닫았다가 다시 열면 환경 변수가 더 이상 정의되지 않은 것을 볼 수 있습니다.

이 스크립트를 실행할 수 있도록 PowerShell 설정을 업데이트해야 할 수도 있지만,이 설정을 Google을위한 연습으로 남겨 두겠습니다.


탐색기를 종료했다가 다시 시작하지 않는 특별한 이유가 있습니까? 나는 항상 그것을한다.
Prometheus

처음에 떠오르는 두 가지가 있습니다. 첫 번째는 강제 종료 프로세스가 메모리 누수를 일으킬 수 있다는 것입니다. 예, 프로세스는 샌드 박스로되어 있지만 Windows 작업 관리자조차도이 작업을 가볍게하지 말라고 경고합니다. 다른 개인적인 이유는 나의 강박 장애입니다. 탐색기를 종료했다가 다시 시작하면 작업 표시 줄에서 하나를 클릭 할 때 복제본을 포함하여 모든 아이콘이 재정렬됩니다. 아이콘을 열어 놓은 순서대로 유지하고 싶습니다.
Jamie

1
와. 내가 찾은 마술 명령 source .bashrc은 Windows에서 (또는 그 사촌 처럼) 작동 합니다. 이것은 나를 위해 "이것을 참조하십시오"라인의 상단으로갑니다.
bballdave025

18

에서 PowerShell을 당신은 .NET를 사용할 수 있습니다[System.Environment]::SetEnvironmentVariable() 방법 :

  • 하려면 제거 사용자 환경 변수 의 이름을 FOO:

    [Environment]::SetEnvironmentVariable('FOO', $null, 'User')
    

참고 $null더 사용하기 위해 의도되는 신호 제거 변수는 비록 기술적 효과적으로 전달과 동일하다 ''이 경우.

  • 하기 제거 시스템 (컴퓨터 수준) 환경 변수 의 이름은 FOO- 고도를 요구 (관리자 권한으로 실행해야합니다) :

    [Environment]::SetEnvironmentVariable('FOO', $null, 'Machine')
    

더 빠른 실행 외에도 reg.exe 기반의 방법 이다 다른 응용 프로그램이 변경 통보 비아, WM_SETTINGCHANGE메시지 (그러나 모든 응용 프로그램이 그 메시지를들을 수 없습니다).


2
이것이 가장 좋은 대답입니다.
James

1
이 방법은 재부팅 할 필요가 없습니다. 얼마나 우아한 해결책입니까!
jyao

13

CupawnTae에 동의합니다 .

SET 마스터 환경 변경에는 유용하지 않습니다.

참고 : 시스템 변수는 HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment사용자 변수보다 훨씬 깁니다.

따라서 FOOBAR라는 시스템 변수에 대한 전체 명령은 다음과 같습니다.

REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR

(공백을 처리하는 데 필요한 따옴표를 참고하십시오.)

setx명령이 삭제 구문을 지원하지 않는 것이 너무 나쁩니다 . :(

추신 : 책임감있게 사용하십시오-경로 변수를 죽이면 나를 비난하지 마십시오!


원래 질문에 명시 적으로 언급 된 @CMCDragonkai-레지스트리 항목을 제거하지 않고 그냥 비 웁니다. 실제 질문은 레지스트리에서 제거하는 방법입니다
CupawnTae

1
이 기능을 적용하기 전에 cmd를 다시 시작 / 새로 고침해야 할 수도 있습니다.
jiggunjer

@jiggunjer, 새로 고침하는 방법?
Pacerier

@Pacerier는 새로운 터미널을 엽니 다.
jiggunjer

11

DougWare의 답변 에서 명령 이 작동하지 않았지만 다음과 같이 작동했습니다.

reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v FOOBAR /f

바로 가기를 HKLM사용할 수 있습니다 HKEY_LOCAL_MACHINE.


1
또한 사용자 환경 변수는 "HKCU \ Environment"
tzrlk

1
@ Tzrlk, 불일치의 이유는 무엇입니까? HKLM \ Environment에없는 이유는 무엇입니까?
Pacerier

@Pacerier : 왜 그들이 완전히 다른 위치에 그것들을 넣었는지 모르겠지만 시스템이나 사용자 변수 중 하나 또는 둘 다를 제거했는지 확인하려면 완전히 다르다는 것을 알면 도움이됩니다 장소.
tzrlk

2
@ Tzrlk, Windows 측에서 다시 나사로 조여진 디자인이어야합니다.
Pacerier

4

재부팅하지 않고 삭제

OP의 질문은 실제로 powershell, vbscript를 통한 재부팅을 피하거나 이름을 지정하는 방법을 포함하여 광범위하게 답변되었습니다.

그러나 cmd 명령 만 사용해야하고 powershell 또는 vbscript를 호출 할 수있는 기능이없는 경우 다음 방법을 사용할 수 있습니다.

rem remove from current cmd instance
  SET FOOBAR=
rem remove from the registry if it's a user variable
  REG delete HKCU\Environment /F /V FOOBAR
rem remove from the registry if it's a system variable
  REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR
rem tell Explorer.exe to reload the environment from the registry
  SETX DUMMY ""
rem remove the dummy
  REG delete HKCU\Environment /F /V DUMMY

따라서 여기서 마술은 "setx"를 사용하여 필요하지 않은 변수 (예 : DUMMY)에 변수를 할당하면 powershell없이 Explorer.exe가 레지스트리에서 변수를 다시 읽도록 강제한다는 것입니다. 그런 다음 더미를 정리하면 탐색기 환경에 조금 더 오래 머 무르더라도 다른 사람에게 해를 끼치 지 않을 것입니다.

또는 변수를 삭제 한 후 새 변수를 설정해야하는 경우 더미가 필요하지 않습니다. SETX를 사용하여 새 변수를 설정하면 시작할 수있는 새 cmd 작업에서 방금 제거한 변수가 자동으로 지워집니다.

배경 정보 : 방금 기존 cmd 스크립트를 수정하여이 접근 방식을 성공적으로 사용하여 사용자 변수 세트를 작업중인 모든 컴퓨터에서 동일한 이름의 시스템 변수로 대체했습니다. 수동으로 수행 할 컴퓨터가 너무 많거나 추가 파워 쉘이나 vbscript를 모두 복사하는 것이 실용적이지 않았습니다. 사용자를 시스템 변수로 긴급하게 교체 해야하는 이유는 사용자 변수가 로밍 프로필에서 동기화되므로 (생각하지 않았 음) 동일한 Windows 로그인을 사용하지만 다른 값을 필요로하는 여러 컴퓨터가 혼동되기 때문입니다.


3
setx FOOBAR ""

FOOBAR의 값이 널 문자열이되도록합니다. (그러나, 그것은set ""와 함께 명령으로 되므로 큰 따옴표가 문자열 일 수 있습니다.)

나는 사용했다 :

set FOOBAR=

FOOBAR가 더 이상 set 명령에 나열되지 않았습니다. (로그 오프하지 않아도됩니다.)

Windows 7 32 비트, 명령 프롬프트를 사용하여 비 관리자가 내가 사용한 것입니다. (cmd 또는 Windows+ 아님 R)는 다를 수 있습니다.

BTW, 나는 그것을 만든 후에 레지스트리의 아무 곳에서나 만든 변수를 보지 못했습니다. 관리자가 아닌 RegEdit을 사용하고 있습니다.


1

작은 VBScript 스크립트를 만들 수도 있습니다 .

Set env = CreateObject("WScript.Shell").Environment("System")
If env(WScript.Arguments(0)) <> vbNullString Then env.Remove WScript.Arguments(0)

그런 다음처럼 호출하십시오 %windir%\System32\cscript.exe //Nologo "script_name.vbs" FOOBAR.

단점은 추가 스크립트가 필요하지만 재부팅 할 필요가 없다는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.