PowerShell을 사용하여 Windows 환경 변수를 설정하고, 환경 변수를 읽고, 새로운 환경 변수를 생성하는 것은 한 번 알면 쉽습니다. 이 문서에서 배울 수 있는 팁은 Windows 10 환경 변수뿐만 아니라 Windows 7 SP1/Windows Server 2008 이후의 모든 Windows 클라이언트/서버에도 적용됩니다.
PowerShell은 $env:
PSDrive, 레지스트리 및 [System.Environment]
.NET 클래스를 통해 Windows 환경 변수와 상호 작용하는 다양한 방법을 제공합니다. 환경 변수의 범위를 이해하며 각 방법에 대해 알아보겠습니다.
가정사항
이 문서에서는 Windows 10에서 Windows PowerShell 5.1을 사용합니다. 그러나 Windows 7 SP1 이상에 Windows PowerShell v3 이상의 버전이 있다면, 이제 보여줄 기술은 아무 문제없이 작동해야 합니다.
환경 변수란 무엇인가요?
환경 변수는 이름 그대로 Windows 및 응용 프로그램에서 사용하는 환경에 관한 정보를 저장합니다. 환경 변수는 Windows 탐색기와 메모장과 같은 그래픽 응용 프로그램뿐만 아니라 cmd.exe와 PowerShell과 같은 일반 텍스트 편집기에서도 액세스할 수 있습니다.
환경 변수를 사용하면 PowerShell 스크립트나 모듈에서 파일 경로, 사용자 또는 컴퓨터 이름 등을 하드 코딩하는 것을 피할 수 있습니다.
일반적인 환경 변수
PowerShell에서 환경 변수와 함께 작업하는 방법에 대해 더 많이 배우기 시작하면 여러 가지 다른 변수들을 만나게 될 것입니다. 일부는 다른 것보다 유용합니다. 아래는 일반적인 환경 변수와 그 사용법에 대한 참고용 목록입니다.
Variable | Usage |
---|---|
ClientName | The name of the remote computer connected via a Remote Desktop session. |
SessionName | This helps to identify if the current Windows session is regarded by the operating system as running at the console. For console sessions SessionName will be ‘Console’. Enhanced Session connections to Hyper-V Virtual Machines do not report SessionName as ‘Console’, whereas Standard Sessions do. |
ComputerName | The name of the computer. |
SystemRoot and Windir | The path to the current Windows installation. |
ProgramFiles and ProgramFiles(x86) | The default locations for x64 and x86 programs. |
ProgramW6432 | The default location for programs, avoiding 32/64 bit redirection. This variable only applies for 32 bit processes running on a 64 bit platform. This means that you can use it to identify when a 32 bit instance of PowerShell is running on a 64 bit system. |
UserDNSDomain | The Fully Qualified Domain Name of the Active Directory domain that the current user logged on to. Only present for domain logons. |
UserDomain | The NETBIOS-style name of the domain that the current user logged on to. Can be a computer name if there’s no domain. |
UserDomainRoamingProfile | The location of the central copy of the roaming profile for the user, if any. Only present for domain logons. |
UserName | The name of the currently logged on user. |
UserProfile | The location of the profile of the current user on the local computer. |
환경 변수 범위
환경 변수에는 세 가지 범위가 있습니다. 범위를 변수의 계층으로 생각해보세요. 이러한 “계층”은 Windows에서 실행 중인 모든 프로세스에 많은 다른 환경 변수를 제공합니다.
환경 변수 범위 “계층구조”
이 “계층” 각각은 서로를 결합하거나 덮어씁니다. 이러한 “계층”은 시스템 -> 사용자 -> 프로세스와 같은 계층구조로 정의됩니다. 각 범위별 변수가 부모 범위에 이미 존재한다면 해당 변수는 부모 범위의 변수를 덮어씁니다.
예를 들어, 일반적인 환경 변수는 TEMP
입니다. 이 변수는 Windows의 로컬 임시 폴더의 폴더 경로를 저장합니다. 이 환경 변수는 다음과 같이 설정됩니다:
C:\WINDOWS\TEMP
in the machine scopeC:\Users\<username>\AppData\Local\Temp
in the user scopeC:\Users\<username>\AppData\Local\Temp
in the process scope.
사용자 범위에 TEMP
환경 변수가 설정되어 있지 않다면 최종 결과는 C:\WINDOWS\TEMP
가 됩니다.
환경 변수 범위 유형
Windows에는 세 가지 다른 환경 변수 범위가 있습니다.
시스템
시스템 범위의 환경 변수는 Windows의 실행 인스턴스와 관련이 있습니다. 모든 사용자 계정은 이러한 변수를 읽을 수 있지만, 설정, 변경 또는 삭제하는 경우에는 관리자 권한이 필요합니다.
사용자
사용자 범위의 환경 변수는 현재 프로세스를 실행하는 사용자와 관련이 있습니다. 사용자 변수는 동일한 이름을 가진 기계-범위 변수를 덮어씁니다.
참고: Microsoft는 기계 및 사용자 범위의 환경 변수 값이 2048자를 초과하지 않도록 권장합니다.
프로세스
환경 변수는 프로세스 범위에는 기계 및 사용자 범위의 변수와 Windows가 동적으로 생성하는 일부 변수를 포함합니다.
아래는 실행 중인 프로세스에서 사용할 수 있는 환경 변수 목록입니다. 이러한 변수는 모두 동적으로 생성됩니다.
ALLUSERSPROFILE
APPDATA
COMPUTERNAME
HOMEDRIVE
HOMEPATH
LOCALAPPDATA
LOGONSERVER
PROMPT
PUBLIC
SESSION
SystemDrive
SystemRoot
USERDNSDOMAIN
USERDOMAIN
USERDOMAIN_ROAMINGPROFILE
USERNAME
USERPROFILE
레지스트리의 환경 변수
환경 변수는 사용자 범위와 기계 범위에 대해 두 개의 레지스트리 위치에 저장됩니다.
환경 변수 관리에 레지스트리를 사용하지 마십시오
레지스트리 내의 변수를 변경할 때 주의해야 합니다. 실행 중인 프로세스는 레지스트리의 변수 변경을 볼 수 없습니다. 프로세스는 시작될 때 레지스트리 변수와 값만 보이며, Windows가 변경 사항을 알릴 때까지 변경된 사항을 볼 수 없습니다.
레지스트리를 직접 수정하는 대신 .NET 클래스를 사용할 수 있습니다. .NET [System.Environment]
클래스는 레지스트리 관리를 담당하면서 기계 및 사용자–범위 환경 변수를 수정할 수 있습니다.
레지스트리를 직접 수정하는 것은 가능하지만, 의미가 없습니다. .NET 클래스는 더 간단하고 Microsoft에서 지원하는 접근 방식을 제공합니다. 이 문서에서는 나중에 [System.Environment]
.NET 클래스 사용 방법에 대해 알아볼 것입니다.
환경 변수 레지스트리 위치 및 조회
I hope you’ve been convinced to not modify the registry directly but if you’d like to take a peek at what’s in there, you can find all user environment variables in the HKEY_CURRENT_USER\Environment
key. Machine-scoped environment variables are stored at HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
.
이러한 키 중 하나의 내부에는 REG_SZ
또는 REG_EXPAND_SZ
유형의 레지스트리 값이 있습니다. REG_EXPAND_SZ
값은 값의 일부로 포함된 환경 변수를 포함합니다. 이러한 환경 변수는 값을 검색할 때 확장됩니다.
이를 증명하기 위해 REG
유틸리티를 사용합니다. 이는 Windows에 포함된 작은 명령 줄 유틸리티입니다.
TEMP
환경 변수를 아래와 같이 조회하십시오. REG
를 실행하여 TEMP
변수의 값을 검색하는 QUERY
매개 변수를 사용하십시오.
위와 같이 퍼센트 기호로 둘러싸인 환경 변수가 표시되는 것을 가끔씩 볼 수 있습니다. 이는 cmd.exe 및 배치 파일을 통해 환경 변수를 표시하는 고전적인 방법입니다. PowerShell은 이 형식을 인식하지 않는다는 것을 알고 계십시오.
REG
유틸리티를 사용하면 레지스트리 값의 원래 값을 볼 수 있습니다. 값 유형은 REG_EXPAND_SZ
이고 값은 %USERPROFILE%
환경 변수를 포함합니다.
PowerShell을 사용하여 레지스트리 값을 검색하려면 아래와 같이 Get-Item
cmdlet을 사용할 수 있습니다.
GUI를 통해 Windows 환경 변수 보기 및 설정
사용자 및 시스템 환경 변수의 GUI 보기를 보려면 PowerShell, 명령 프롬프트 또는 Windows 키+R에서 SystemPropertiesAdvanced.exe를 실행하여 시스템 속성 고급 탭을 표시하십시오. 아래 이미지에서 강조된 EnvironmentVariables 단추를 클릭하십시오.

아래 그림과 같이 환경 변수 대화 상자에서 사용자 및 기계 범위의 환경 변수를 보고, 생성하고 수정할 수 있습니다. 대화 상자에서 기계 범위 변수를 시스템 변수라고 참고하십시오.

이제 환경 변수에 대한 이해를 갖추었으니, PowerShell을 사용하여 원하는 것인 환경 변수 관리로 들어가 봅시다!
PowerShell을 사용하여 환경 변수와 상호 작용하는 몇 가지 방법이 있습니다.
- Env: PSDrive 및 제공자 – 세션 기반입니다. 현재 PowerShell 세션의 환경 변수 값만 설정합니다.
- $env: 변수 – 세션 기반입니다. 현재 PowerShell 세션의 환경 변수 값만 설정합니다.
- [System.Environment] .NET 클래스 – 세션과 재부팅을 거쳐 사용자 및 시스템 범위의 환경 변수를 유지할 수 있습니다.
Env: PSDrive 및 제공자
환경 변수를 읽는 가장 좋은 방법 중 하나는 PowerShell 드라이브(PS 드라이브)라고 불리는 PowerShell 개념입니다. PS 드라이브를 사용하면 Env: 드라이브를 통해 환경 변수를 파일 시스템처럼 다룰 수 있습니다.
Env: 드라이브로 전환하기
모든 PS 드라이브와 마찬가지로, Env:\TEMP, Env:\COMPUTERNAME 등과 같은 경로를 통해 참조합니다. 하지만 몇 가지 키 입력을 절약하기 위해, 아래와 같이 파일 시스템 드라이브를 전환하듯이 Env: 드라이브로 전환할 수 있습니다.
Env: 드라이브와 탭 완성
파일 시스템에 액세스하는 데 사용하는 명령인 Get-Item
및 Get-ChildItem
을(를) 환경 변수에 액세스하는 데 사용할 수 있습니다. 하지만 파일 시스템 대신 Env:
드라이브를 읽고 있습니다.
환경 변수는 PS 드라이브에 저장되므로 PowerShell의 탭 완성 기능을 사용하여 사용 가능한 변수를 순환할 수 있습니다. 아래에 표시된대로입니다.

이제 몇 가지 예제로 Env:
PS 드라이브를 사용하여 환경 변수를 처리하는 방법을 살펴보겠습니다.
Env:
로 환경 변수 나열하기
Env:
와 와일드카드를 사용하여 환경 변수 나열하기
Env:
로 환경 변수 값 찾기
이러한 명령의 결과는 키/값 [System.Collections.DictionaryEntry]
.NET 객체입니다. 이러한 객체는 환경 변수의 이름을 Name
속성에, 값은 Value
속성에 보관합니다.
아래에 표시된대로, 환경 변수의 특정 값을 액세스하려면 Get-Item
명령 참조를 괄호로 묶고 Value
속성에 참조합니다:
특정 환경 변수만 반환해야하는 상황에서는 Select-Object
및 Where-Object
와 같은 표준 PowerShell cmdlet을 사용하여 Env:
공급자에 의해 반환되는 객체를 선택하고 필터링합니다.
아래 예제에서는 환경 변수 COMPUTERNAME
만 반환됩니다.
대안으로 Get-Content
cmdlet을 사용할 수 있습니다. 이 cmdlet은 환경 변수의 값이 포함된 [String]
객체를 반환합니다. 이 객체는 Name
및 Value
속성이 있는 객체 대신 값만 반환하여 처리하기가 간단합니다.
데모: 문자열에 환경 값을 삽입
Get-Content
를 사용하여 예를 들어 텍스트 문자열에 COMPUTERNAME
환경 변수를 찾고 삽입할 수 있습니다.
Env:
를 사용하여 환경 변수 설정(및 생성)
New-Item
cmdlet을 사용하여 PowerShell에서 새로운 환경 변수를 생성할 수 있습니다. Env:\<EnvVarName>
형식으로 환경 변수의 이름을 Name
값으로 제공하고 환경 변수의 값을 Value
매개변수로 제공합니다. 아래 예제를 참조하세요.
Set-item
cmdlet을 사용하여 환경 변수를 설정하거나, 이미 존재하지 않는 경우 새로 생성할 수 있습니다. 아래에서 Set-Item
cmdlet을 사용하여 환경 변수를 생성하거나 수정할 수 있음을 확인할 수 있습니다.
Env:
를 사용하여 환경 변수 복사
환경 변수 값 복제가 필요한 경우가 있습니다. Copy-Item
cmdlet을 사용하여 이를 수행할 수 있습니다.
아래에서 COMPUTERNAME
변수의 값을 MYCOMPUTER
로 복사하여 기존 값이 덮어쓰여진 것을 확인할 수 있습니다.
Env:
를 사용하여 환경 변수 제거
더 이상 필요하지 않은 환경 변수를 제거해야 할 때 세 가지 방법을 사용할 수 있습니다:
Set-Item
cmdlet을 사용하여 환경 변수를 빈 값으로 설정
Remove-Item
cmdlet을 사용
Clear-Item
cmdlet을 사용
Env:
를 사용하여 환경 변수 이름 변경
환경 변수 이름을 변경해야 하는 경우, Env:
제공자를 사용하여 삭제하고 다시 생성하는 대신 이름을 변경할 수 있습니다.
Rename-Item
cmdlet을 사용하여 환경 변수의 이름을 변경하면서 값을 유지합니다. 아래에서는 MYCOMPUTER
변수를 OLDCOMPUTER
로 이름을 변경하면서 값도 유지합니다.
$Env:
변수
Env:
드라이브를 활용하여 환경 변수를 파일로 다루는 방법을 익힌 후, 이 섹션에서는 변수로서 환경 변수를 처리하는 방법을 보여줍니다. 또 다른 방법으로는 PowerShell 표현 분석기를 사용하여 세션 내 환경 변수를 관리할 수 있습니다. 이 기능을 사용하면 $Env:
스코프를 사용하여 환경 변수에 액세스할 수 있습니다.
$Env:
를 사용하여 환경 변수 가져오기
$Env
스코프를 사용하여 아래와 같이 Get-Item
과 같은 명령을 사용하지 않고 환경 변수를 직접 참조할 수 있습니다.
이 방법을 사용하면 아래와 같이 환경 변수를 문자열에 삽입하기 쉽습니다:
$Env:
를 사용하여 환경 변수 설정 또는 생성
이 방법을 사용하여 환경 변수를 설정하는 것은 간단합니다. 이 방법은 이미 존재하지 않는 경우 새로운 환경 변수를 생성합니다.
기존 값에 추가하는 것이 아니라 덮어쓰지 않도록 +=
구문을 사용합니다.
$Env:
를 사용하여 환경 변수 제거
이 방법을 사용하여 환경 변수를 제거하려면 해당 값을 빈 문자열로 설정하면 됩니다.
[System.Environment]
.NET 클래스 사용하기
.NET 클래스 [System.Environment]
은 환경 변수를 가져오고 설정하는 메서드를 제공합니다. 이는 다양한 환경 범위에 직접 액세스하고 PowerShell 세션 간에 유지되는 환경 변수를 설정하는 유일한 방법입니다.
다음 예제에서 모든 범위가 제공되지 않은 경우 프로세스 범위가 가정됩니다.
[System.Environment]
을 사용할 때는 몇 가지 다른 .NET 정적 클래스 메서드를 사용합니다. 정적 메서드가 무엇인지 이해할 필요는 없습니다. 배울 기술 중 하나를 사용하려면 먼저 클래스([System.Environment]
)를 참조한 다음 두 개의 콜론(::
)을 사용하여 메서드를 사용하는 방법을 이해하면 됩니다.
[System.Environment]
으로 환경 변수 나열하기
특정 범위에서 모든 환경 변수를 보려면 GetEnvironmentVariables
메서드를 사용합니다. 이 메서드는 메서드 인수로 지정된 범위의 모든 환경 변수를 반환합니다.
[System.Environment]
으로 단일 환경 변수 가져오기
특정 환경 변수를 찾아야 하는 경우 두 가지 다른 방법으로 찾을 수 있습니다.
GetEnvironmentVariables().<변수 이름>
– 권장하지 않음GetEnvironmentVariable('<변수 이름>','<범위>')
GetEnvironmentVariables()
GetEnvironmentVariables()
메서드를 사용하면 점 표기법을 사용하여 값을 참조합니다. [System.Environment]
클래스와 정적 메서드 참조를 괄호로 감싼 다음 점(.) 다음에 환경 변수의 이름을 입력합니다.
이러한 방식으로 환경 변수를 참조할 때 대소문자를 정확히 일치시켜야 합니다! 위의 예제에서는
APPDATA
변수를appdata
로 참조해 보세요. 대신GetEnvironmentVariable()
을 사용하세요.
GetEnvironmentVariable()
GetEnvironmentVariables()
메서드 대신 단일 환경 변수를 찾기 위해 GetEnvironmentVariable()
을 사용하세요. 이 방법은 대소문자 구분 문제를 해결할 수 있으며, 범위를 지정할 수도 있습니다.
이 메서드를 사용하려면 환경 변수 이름과 해당 변수를 찾을 범위를 쉼표로 구분하여 지정하세요.
[System.Environment]
를 사용하여 환경 변수 설정하기
주어진 범위에 대한 환경 변수의 값을 설정하거나, 해당 변수가 이미 존재하지 않는 경우 새로 생성하려면 SetEnvironmentVariable()
메서드를 사용하세요.
변수를 프로세스 범위에 설정할 때, 프로세스 범위는 변동적이며 사용자 및 기계 범위의 변경은 영구적입니다.
참고: 변수 이름 또는 값이 32767자 이상인 경우 SetEnvironmentVariable 메소드를 호출하면 예외가 발생합니다.
환경 변수 제거하기 with [System.Environment]
빈 문자열로 값을 설정하여 지정된 범위의 환경 변수를 제거하려면 SetEnvironmentVariable() 메소드를 사용하십시오.
유용한 PowerShell 환경 변수
PowerShell은 다른 Windows 응용 프로그램과 마찬가지로 몇 가지 고유한 환경 변수를 가지고 있습니다. 알아야 할 두 가지 유용한 환경 변수는 PSExecutionPolicyPreference와 PSModulePath입니다.
PSExecutionPolicyPreference
PSExecutionPolicyPreference
환경 변수는 현재 PowerShell 실행 정책을 저장합니다. 세션별 PowerShell 실행 정책이 설정되는 경우 다음과 같이 생성됩니다:
Set-ExecutionPolicy
cmdlet을Scope
매개변수가Process
인 상태로 실행합니다.powershell.exe
실행 파일을 사용하여 새 세션을 시작하고 실행 정책을 설정하기 위해 실행 정책 명령줄 매개변수를 사용합니다.
PSModulePath
PSModulePath
환경 변수에는 PowerShell이 전체 경로를 지정하지 않은 경우 모듈을 검색하는 경로가 포함되어 있습니다. 이 변수는 일반적인 PATH
환경 변수와 유사하게 구성되며, 개별 디렉토리 경로는 세미콜론으로 구분됩니다.
팁: 각 폴더를 분리하여 문자열 배열을 얻고, $env:PSModulePath.split(‘;’)를 사용하여 각 경로를 개별적으로 처리할 수 있습니다.
요약
환경 변수는 실행 중인 시스템에 대한 정보를 얻거나 세션 및 재부팅 간에 정보를 저장하는 유용한 방법입니다. Windows 운영 체제의 기본 환경 변수를 읽고 사용자 정의 환경 변수를 생성하든 상관없이 PowerShell을 사용하여 다양한 방법으로 관리할 수 있습니다!
추가 독서
- about_Environment_Variables
- Microsoft 문서의 .NET [System.Environment] 클래스
- PowerShell 문자열 형식 및 확장 문자열 배우기
Source:
https://adamtheautomator.com/powershell-environment-variables/