about_Variables — PowerShell에서 변수 다루기
about_Variables — PowerShell에서 변수 다루기
스크립트를 짜다 보면 명령의 결과를 잠시 담아 두고 싶을 때가 있어요. 그럴 때 쓰는 게 변수(variable)예요. 이 글에서는 PowerShell의 변수가 뭔지, 어떤 종류가 있는지, 만들고 바꾸고 지우는 법, 이름 규칙과 범위(scope)까지 차근차근 설명해 드릴게요. 코드는 그대로 두어서 바로 따라 해 보실 수 있어요.
본문
간단한 설명
PowerShell에서 사용할 수 있는 값을 저장하는 변수에 대해 다루는 문서예요.
자세한 설명
PowerShell 변수에는 모든 종류의 값을 담을 수 있어요. 예를 들어 명령의 결과를 저장하거나, 명령과 식에서 쓰는 이름·경로·설정·값 같은 요소를 저장할 수 있죠.
변수는 값을 저장하는 메모리의 한 단위예요. PowerShell에서는 변수를 $(달러 기호)로 시작하는 문자열로 표현해요. $a, $process, $my_var처럼요.
변수 이름은 대소문자를 구분하지 않아요. 공백이나 특수 문자도 넣을 수 있지만, 그런 이름은 쓰기가 까다로워서 피하는 게 좋아요. 자세한 내용은 특수 문자가 포함된 변수 이름에서 다룰게요.
PowerShell에는 몇 가지 유형의 변수가 있어요.
-
사용자 생성 변수: 사용자가 직접 만들고 관리하는 변수예요. 기본적으로 명령줄에서 만든 변수는 PowerShell 창이 열려 있는 동안만 존재해요. 창을 닫으면 변수도 사라지죠. 변수를 유지하려면 PowerShell 프로필에 추가하면 돼요. 스크립트 안에서는 global, script, local 범위로 변수를 만들 수도 있어요.
-
자동 변수(Automatic variables): PowerShell의 상태를 저장하는 변수예요. PowerShell이 직접 만들고, 정확성을 유지하기 위해 값을 알아서 변경해요. 사용자는 이 값들을 바꿀 수 없어요. 예를 들어
$PSHOME변수는 PowerShell 설치 디렉터리의 경로를 저장해요. 자동 변수의 목록과 설명은 about_Automatic_Variables를 참고하세요. -
기본 설정 변수(Preference variables): 사용자가 PowerShell에 대해 정한 선호를 저장하는 변수예요. PowerShell이 만들고 기본값으로 채워 두지만, 값은 사용자가 바꿀 수 있어요. 예를 들어
$MaximumHistoryCount변수는 세션 기록에 남길 최대 항목 수를 정해요. 기본 설정 변수에 대한 설명은 about_Preference_Variables를 보세요.
변수 다루기
새 변수를 만들려면 대입문(assignment statement)으로 변수에 값을 넣으면 돼요. 사용하기 전에 변수를 미리 선언할 필요가 없어요. 모든 변수의 기본값은 $null이에요.
현재 PowerShell 세션의 모든 변수 목록을 보려면 Get-Variable을 입력해요. 변수 이름은 앞의 $ 기호 없이 표시돼요.
예를 들어:
$MyVariable = 1, 2, 3
$Path = "C:\Windows\System32"
변수는 명령 결과를 저장할 때 특히 유용해요.
예를 들어:
$Processes = Get-Process
$Today = (Get-Date).DateTime
변수의 값을 표시하려면 변수 이름 앞에 $를 붙여 입력하면 돼요.
예를 들어:
$MyVariable
1
2
3
$Today
Tuesday, September 3, 2019 09:46:46
변수 값을 바꾸려면 새 값을 대입하면 돼요.
아래 예시는 $MyVariable 변수의 값을 보여 주고, 값을 바꾼 다음 다시 새 값을 보여 줘요.
$MyVariable = 1, 2, 3
$MyVariable
1
2
3
$MyVariable = "The green cat."
$MyVariable
The green cat.
변수 값을 지우려면 Clear-Variable cmdlet을 쓰거나 값을 $null로 바꾸면 돼요.
Clear-Variable -Name MyVariable
$MyVariable = $null
변수 자체를 삭제하려면 Remove-Variable 또는 Remove-Item을 사용해요.
Remove-Variable -Name MyVariable
Remove-Item -Path Variable:\MyVariable
한 문으로 여러 변수에 값을 넣을 수도 있어요. 아래 예시는 여러 변수에 같은 값을 대입해요:
$a = $b = $c = 0
다음 예시는 여러 변수에 서로 다른 값을 대입해요.
$i,$j,$k = 10, "red", $true # $i is 10, $j is "red", $k is True
$i,$j = 10, "red", $true # $i is 10, $j is [Object[]], Length 2
여러 변수에 값을 대입하는 방법을 더 자세히 보려면 about_Assignment_Operators의 "Assigning multiple variables" 섹션을 참고하세요.
변수의 유형
변수에는 정수, 문자열, 배열, 해시 테이블 같은 어떤 유형의 객체든 저장할 수 있어요. 프로세스, 서비스, 이벤트 로그, 컴퓨터를 나타내는 객체도요.
PowerShell 변수는 느슨한 형식(loosely typed)이라 특정 유형의 객체에 제한되지 않아요. 하나의 변수가 서로 다른 유형의 객체 모음, 즉 배열을 한 번에 담을 수도 있어요.
변수의 데이터 형식은 그 값의 .NET 형식에 따라 정해져요. 변수의 객체 형식을 확인하려면 Get-Member를 사용해요.
예를 들어:
$a = 12 # System.Int32
$a = "Word" # System.String
$a = 12, "Word" # array of System.Int32, System.String
$a = Get-ChildItem C:\Windows # FileInfo and DirectoryInfo types
형식 특성(type attribute)과 캐스트 표기법(cast notation)을 쓰면 변수가 특정 객체 유형만 담도록 제한할 수 있어요. 다른 유형의 값을 대입하려 하면 PowerShell이 그 값을 해당 형식으로 변환하려고 해요. 변환이 안 되면 대입문이 실패해요.
캐스트 표기법을 쓰려면 대입문 왼쪽, 변수 이름 앞에 대괄호로 감싼 형식 이름을 넣으면 돼요. 아래 예시는 정수만 담을 수 있는 $number 변수, 문자열만 담을 수 있는 $words 변수, DateTime 객체만 담을 수 있는 $dates 변수를 만들어요.
[int]$number = 8
$number = "12345" # The string is converted to an integer.
$number = "Hello"
Cannot convert value "Hello" to type "System.Int32". Error: "Input string
was not in a correct format."
At line:1 char:1
+ $number = "Hello"
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : MetadataError: (:) [],
ArgumentTransformationMetadataException
+ FullyQualifiedErrorId : RuntimeException
[string]$words = "Hello"
$words = 2 # The integer is converted to a string.
$words += 10 # The plus (+) sign concatenates the strings.
$words
210
[datetime] $dates = "09/12/91" # The string is converted to a DateTime object.
$dates
Thursday, September 12, 1991 00:00:00
$dates = 10 # The integer is converted to a DateTime object.
$dates
Monday, January 1, 0001 00:00:00
명령과 식에서 변수 사용하기
명령이나 식에서 변수를 쓰려면 변수 이름 앞에 $를 붙이면 돼요.
변수 이름과 $가 따옴표로 감싸져 있지 않거나, 큰따옴표(") 안에 있으면 변수의 값이 사용돼요.
반대로 작은따옴표(')로 감싸면 변수 이름 자체가 식에서 사용돼요.
PowerShell에서 따옴표를 쓰는 방법에 대한 자세한 내용은 about_Quoting_Rules를 보세요.
아래 예시는 PowerShell 콘솔의 사용자 프로필 파일 경로를 담고 있는 $PROFILE 변수의 값을 가져와요.
$PROFILE
C:\Users\User01\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
이번 예시에서는 notepad.exe로 PowerShell 프로필을 여는 명령 두 개를 보여 줘요. 큰따옴표(")를 쓴 예시는 변수의 값을 사용해요.
notepad $PROFILE
notepad "$PROFILE"
아래 예시들은 변수를 문자 그대로 취급하는 작은따옴표(')를 사용해요.
'$PROFILE'
$PROFILE
'Use the $PROFILE variable.'
Use the $PROFILE variable.
특수 문자가 포함된 변수 이름
변수 이름은 $로 시작하고 영숫자 문자와 특수 문자를 포함할 수 있어요. 변수 이름 길이는 사용 가능한 메모리에 의해서만 제한돼요.
권장하는 방법은 변수 이름에 영숫자 문자와 밑줄(_)만 사용하는 거예요. 공백이나 다른 특수 문자가 들어간 변수 이름은 쓰기 까다로우니 피하는 게 좋아요.
영숫자 변수 이름에는 다음 문자를 쓸 수 있어요:
-
다음 범주의 유니코드 문자: Lu, Ll, Lt, Lm, Lo, Nd.
-
밑줄(
_) 문자. -
물음표(
?) 문자.
아래 목록은 설명과 함께 유니코드 범주의 .NET 이름이에요. 자세한 내용은 UnicodeCategory를 참고하세요.
-
Lu - UppercaseLetter - 대문자
-
Ll - LowercaseLetter - 소문자
-
Lt - TitlecaseLetter - 앞부분이 대문자인 단일 문자로 인코딩된 이중 문자(digraph)
-
Lm - ModifierLetter - 수식 문자
-
Lo - OtherLetter - 음절과 표의 문자를 포함한 기타 문자
-
Nd - DecimalDigitNumber - 십진 숫자
공백이나 특수 문자가 포함된 변수 이름을 만들거나 표시하려면 변수 이름을 중괄호({})로 감싸면 돼요. 중괄호는 변수 이름의 문자를 문자 그대로 해석하라고 PowerShell에 지시해요.
특수 문자가 포함된 변수 이름에는 다음 문자를 쓸 수 있어요:
- 다음 예외를 제외한 모든 유니코드 문자:
닫는 중괄호(}) 문자 (U+007D).
- 백틱(
`) 문자 (U+0060). 백틱은 유니코드 문자를 이스케이프해서 문자 그대로 취급되게 해요.
PowerShell에는 $$, $?, $^, $_ 같은 예약 변수도 있어요. 이들은 영숫자 문자와 특수 문자를 함께 담고 있어요. 자세한 내용은 about_Automatic_Variables를 보세요.
예를 들어 아래 명령은 save-items라는 변수를 만들어요. 변수 이름에 하이픈(-) 특수 문자가 있어서 중괄호({})가 필요해요.
${save-items} = "a", "b", "c"
${save-items}
a
b
c
아래 명령은 ProgramFiles(x86) 환경 변수가 나타내는 디렉터리의 하위 항목을 가져와요.
Get-ChildItem ${Env:ProgramFiles(x86)}
중괄호가 포함된 변수 이름을 참조하려면 변수 이름을 중괄호로 감싸고, 백틱 문자로 중괄호를 이스케이프하면 돼요. 예를 들어 this{value}is라는 변수를 만들려면 이렇게 입력해요:
${this`{value`}is} = "This variable name uses braces and backticks."
${this`{value`}is}
This variable name uses braces and backticks.
변수와 범위(Scope)
기본적으로 변수는 만들어진 범위 안에서만 사용할 수 있어요.
예를 들어 함수 안에서 만든 변수는 함수 안에서만, 스크립트 안에서 만든 변수는 스크립트 안에서만 쓸 수 있어요. 스크립트를 점 소싱(dot-source)하면 변수가 현재 범위에 추가돼요. 자세한 내용은 about_Scopes를 참고하세요.
범위 한정자(scope modifier)를 쓰면 변수의 기본 범위를 바꿀 수 있어요. 아래 식은 Computers라는 변수를 만들어요. 스크립트나 함수에서 만들었더라도 이 변수는 전역(global) 범위를 가져요.
$Global:Computers = "Server01"
세션 밖에서 실행되는 스크립트나 명령이라면, 호출한 세션 범위에서 변수 값을 끌어다 쓰기 위해 Using: 범위 한정자가 필요해요. 그래야 세션 밖 코드에서 그 값을 접근할 수 있거든요.
자세한 내용은 about_Remote_Variables를 참고하세요.
변수 저장하기
만든 변수는 만든 세션에서만 쓸 수 있고, 세션을 닫으면 사라져요.
앞으로 시작하는 모든 PowerShell 세션에서 그 변수를 만들려면 PowerShell 프로필에 추가하면 돼요.
예를 들어 모든 PowerShell 세션에서 $VerbosePreference 변수의 값을 바꾸려면 PowerShell 프로필에 아래 명령을 추가해요.
$VerbosePreference = "Continue"
이 명령은 notepad.exe 같은 텍스트 편집기에서 $PROFILE 파일을 열어 추가할 수 있어요. PowerShell 프로필에 대한 자세한 내용은 about_Profiles를 참고하세요.
Variable: 드라이브
PowerShell Variable 공급자는 Variable: 드라이브를 만들어요. 파일 시스템 드라이브처럼 보이고 작동하지만, 실제로는 세션의 변수와 그 값을 담고 있어요.
Variable: 드라이브로 이동하려면 다음 명령을 사용해요:
Set-Location Variable:
Variable: 드라이브의 항목과 변수를 나열하려면 Get-Item 또는 Get-ChildItem cmdlet을 사용해요.
Get-ChildItem Variable:
특정 변수의 값을 가져오려면 파일 시스템 표기법으로 드라이브 이름과 변수 이름을 지정하면 돼요. 예를 들어 $PSCulture 자동 변수의 값을 가져오려면 다음 명령을 사용해요.
Get-Item Variable:\PSCulture
Name Value
---- -----
PSCulture en-US
Variable: 드라이브와 PowerShell Variable 공급자에 대한 더 자세한 정보를 보려면 다음을 입력해요:
Get-Help Variable
공급자 경로와 변수 구문
공급자 경로 앞에 $를 붙이면, IContentCmdletProvider 인터페이스를 구현한 공급자의 내용에 접근할 수 있어요.
다음의 기본 제공 PowerShell 공급자가 이 표기법을 지원해요:
Variable cmdlet
PowerShell에는 변수를 관리하기 위한 cmdlet 세트가 포함돼 있어요.
cmdlet 목록을 보려면 다음을 입력해요:
Get-Command -Noun Variable
특정 cmdlet의 도움말을 보려면 다음을 입력해요:
Get-Help
| Cmdlet 이름 | 설명 |
|---|---|
Clear-Variable |
변수의 값을 삭제해요. |
Get-Variable |
현재 콘솔의 변수를 가져와요. |
New-Variable |
새 변수를 만들어요. |
Remove-Variable |
변수와 그 값을 삭제해요. |
Set-Variable |
변수의 값을 변경해요. |