about_Automatic_Variables — PowerShell 자동 변수 완전 정복
about_Automatic_Variables — PowerShell 자동 변수 완전 정복
파워셸이 직접 만들어 관리하는 내장 변수들이에요. 주로 읽기 전용으로 쓰라고 만든 거라, 알아두면 스크립트가 훨씬 깔끔해져요.
본문
간단한 설명
파워셸의 상태 정보를 담고 있으면서 파워셸 자체가 만들고 관리하는 변수에 대해 설명하는 문서예요.
자세한 설명
개념적으로 이 변수들은 대부분 읽기 전용으로 봐야 해요. 값을 쓸 수는 있지만, 예전 버전과의 호환성을 지키려면 되도록 쓰지 않는 게 좋아요.
파워셸의 자동 변수 목록이에요:
- $$
- $?
- $^
- $_
- $args
- $ConsoleFileName
- $EnabledExperimentalFeatures
- $Error
- $Event
- $EventArgs
- $EventSubscriber
- $ExecutionContext
- $false
- $foreach
- $HOME
- $Host
- $input
- $IsCoreCLR
- $IsLinux
- $IsMacOS
- $IsWindows
- $LASTEXITCODE
- $Matches
- $MyInvocation
- $NestedPromptLevel
- $null
- $PID
- $PROFILE
- $PSBoundParameters
- $PSCmdlet
- $PSCommandPath
- $PSCulture
- $PSDebugContext
- $PSEdition
- $PSHOME
- $PSItem
- $PSScriptRoot
- $PSSenderInfo
- $PSUICulture
- $PSVersionTable
- $PWD
- $Sender
- $ShellId
- $StackTrace
- $switch
- $this
- $true
$$
세션이 받은 마지막 줄에서 맨 마지막 토큰을 담아요.
$?
마지막 명령의 실행 결과를 담아요. 명령이 성공하면 True, 실패하면 False예요. 구문 오류는 실행 자체가 안 되니까 $? 값에 영향을 주지 않아요.
파이프라인에서 여러 단계에 걸쳐 실행되는 cmdlet이나 고급 함수(예: process 블록과 end 블록 양쪽에서 도는 것)에서는 this.WriteError()나 $PSCmdlet.WriteError()를 어느 시점에 호출해도 $?가 False로 바뀌고, this.ThrowTerminatingError()와 $PSCmdlet.ThrowTerminatingError()도 마찬가지예요.
Write-Error cmdlet은 실행된 직후에 항상 $?를 False로 만들지만, 그걸 호출한 함수 자체에는 $?를 False로 만들지 않아요:
function Test-WriteError
{
Write-Error "Bad"
"The `$? variable is: $?"
}
Test-WriteError
"Now the `$? variable is: $?"
Test-WriteError:
Line |
7 | Test-WriteError
| ~~~~~~~~~~~~~~~
| Bad
The $? variable is: False
Now the $? variable is: True
이 경우에는 $PSCmdlet.WriteError()를 쓰는 게 맞아요.
네이티브 명령(실행 파일)의 경우에는 $LASTEXITCODE가 0이면 $?가 True가 되고, 다른 값이면 False가 돼요.
참고 — 파워셸 7 이전에는 문장을 괄호
(...)나 하위 표현식$(...), 배열 표현식@(...)로 감싸면 항상$?가True로 초기화됐어요. 예를 들어(Write-Error)는$?를True로 보여줬죠. 이 동작은 파워셸 7에서 바뀌어서, 이제는 이런 표현식 안에서도$?가 마지막에 실행된 명령의 실제 성공 여부를 그대로 반영해요.
$^
세션이 받은 마지막 줄에서 맨 첫 토큰을 담아요.
$_
$PSItem과 같아요. 파이프라인에서 현재 객체를 담아요. 파이프라인의 모든 객체마다 어떤 작업을 하는 명령에서 이 변수를 쓸 수 있어요. 자세한 내용은 about_PSItem를 참고하세요.
$args
함수·스크립트·스크립트블록에 전달된, 선언되지 않은 매개변수들의 값을 담은 배열이에요. 함수를 만들 때 param 키워드나 함수 이름 뒤 괄호 안에 콤마로 구분한 매개변수 목록으로 매개변수를 선언할 수 있어요.
이벤트 액션 안에서는 $args 변수가 처리 중인 이벤트의 인자를 나타내는 객체들을 담아요. 이 변수는 이벤트 등록 명령의 Action 블록 안에서만 값이 채워져요. 이 변수 값은 Get-Event가 반환하는 PSEventArgs 객체의 SourceArgs 속성에서도 확인할 수 있어요.
$ConsoleFileName
세션에서 가장 최근에 사용한 콘솔 파일(.psc1)의 경로를 담아요. PSConsoleFile 매개변수로 파워셸을 시작하거나 Export-Console cmdlet으로 스냅인 이름을 콘솔 파일로 내보낼 때 값이 채워져요.
매개변수 없이 Export-Console cmdlet을 쓰면 세션에서 가장 최근에 사용한 콘솔 파일을 자동으로 업데이트해요. 이 자동 변수로 어떤 파일을 업데이트할지 알아낼 수 있어요.
$EnabledExperimentalFeatures
활성화된 실험 기능 이름 목록을 담아요.
$Error
가장 최근의 오류들을 나타내는 오류 객체 배열을 담아요. 가장 최근 오류가 배열의 첫 번째, 즉 $Error[0]이에요.
종료되지 않는 오류가 $Error 배열에 추가되지 않게 하려면 ErrorAction 공통 매개변수에 Ignore 값을 쓰면 돼요. 자세한 내용은 about_CommonParameters를 참고하세요.
$Event
처리 중인 이벤트를 나타내는 PSEventArgs 객체를 담아요. 이 변수는 Register-ObjectEvent 같은 이벤트 등록 명령의 Action 블록 안에서만 값이 채워져요. 이 변수 값은 Get-Event cmdlet이 반환하는 객체와 같아요. Action 스크립트블록 안에서 $Event.TimeGenerated 같은 Event 변수의 속성을 쓸 수 있어요.
$EventArgs
처리 중인 이벤트에서 EventArgs에서 파생된 첫 번째 이벤트 인자를 나타내는 객체를 담아요. 이 변수는 이벤트 등록 명령의 Action 블록 안에서만 값이 채워져요. 이 변수 값은 Get-Event가 반환하는 PSEventArgs 객체의 SourceEventArgs 속성에서도 확인할 수 있어요.
$EventSubscriber
처리 중인 이벤트의 이벤트 구독자를 나타내는 PSEventSubscriber 객체를 담아요. 이 변수는 이벤트 등록 명령의 Action 블록 안에서만 값이 채워져요. 이 변수 값은 Get-EventSubscriber cmdlet이 반환하는 객체와 같아요.
$ExecutionContext
파워셸 호스트의 실행 컨텍스트를 나타내는 EngineIntrinsics 객체를 담아요. 이 변수로 cmdlet에서 쓸 수 있는 실행 객체들을 찾을 수 있어요.
$false
False를 담아요. 명령이나 스크립트에서 문자열 "false" 대신 이 변수로 False를 나타낼 수 있어요. 문자열은 빈 문자열이 아니거나 0이 아닌 정수로 변환되면 True로 해석될 수 있거든요.
$foreach
foreach 루프의 열거자(결과 값이 아니라)를 담아요. $foreach 변수는 foreach 루프가 실행되는 동안에만 존재하고, 루프가 끝나면 삭제돼요.
열거자는 루프 값을 가져오거나 현재 반복을 바꾸는 데 쓸 수 있는 속성과 메서드를 담고 있어요. 자세한 내용은 foreach를 참고하세요.
$HOME
사용자 홈 디렉터리의 전체 경로를 담아요. Windows에서는 $Env:USERPROFILE Windows 환경 변수 값을 쓰는데, 보통 C:\Users\<UserName>이에요. Unix에서는 HOME 환경 변수 값을 써요.
중요 — Windows는 사용자 프로필 위치를 바꿀 수 있어요. 그래서
$HOME이$Env:HOMEDRIVE$Env:HOMEPATH와 값이 다를 수 있어요.
$Host
파워셸의 현재 호스트 애플리케이션을 나타내는 객체를 담아요. 이 변수로 명령에서 현재 호스트를 나타내거나 $Host.Version, $Host.CurrentCulture, $Host.UI.RawUI.BackGroundColor = "Red" 같은 호스트 속성을 표시하거나 변경할 수 있어요.
참고 —
$Host.PrivateData의 색 설정은$PSStyle기본 설정 변수로 대체됐어요. 자세한 내용은 about_ANSI_Terminals를 참고하세요.
$input
함수에 전달된 모든 입력을 순회하는 열거자를 담아요. $input 변수는 함수, 스크립트블록(이름 없는 함수), 스크립트 파일(저장된 스크립트블록)에서만 쓸 수 있어요.
begin, process, end 블록이 없는 함수에서는 $input 변수가 함수에 들어온 모든 입력의 컬렉션을 순회해요.
begin 블록에서는 $input 변수에 데이터가 없어요.
process 블록에서는 $input 변수가 파이프라인의 현재 객체를 담아요.
end 블록에서는 $input 변수가 함수에 들어온 모든 입력의 컬렉션을 순회해요.
참고 — 같은 함수나 스크립트블록 안에서
process블록과end블록 양쪽에 동시에$input변수를 쓸 수는 없어요.
$input은 열거자라서 속성에 접근하면 $input을 더 이상 쓸 수 없게 돼요. $input 속성을 다시 쓰려면 다른 변수에 저장해 두면 돼요. 열거자는 루프 값을 가져오거나 현재 반복을 바꾸는 데 쓸 수 있는 속성과 메서드를 담고 있어요. 자세한 내용은 Using Enumerators를 참고하세요.
$input 변수는 명령줄에서 호출할 때 pwsh의 -Command 매개변수로 지정한 명령에서도 쓸 수 있어요. 다음 예시는 Windows 명령 셸에서 실행하는 거예요.
echo Hello | pwsh -Command """$input World!"""
$IsCoreCLR
현재 세션이 .NET Core 런타임(CoreCLR)에서 돌고 있으면 $true, 아니면 $false를 담아요.
$IsLinux
현재 세션이 Linux 운영체제에서 돌고 있으면 $true, 아니면 $false를 담아요.
$IsMacOS
현재 세션이 macOS 운영체제에서 돌고 있으면 $true, 아니면 $false를 담아요.
$IsWindows
현재 세션이 Windows 운영체제에서 돌고 있으면 $true, 아니면 $false를 담아요.
$LASTEXITCODE
마지막으로 실행된 네이티브 프로그램이나 파워셸 스크립트의 종료 코드를 담아요.
파워셸 스크립트의 경우 $LASTEXITCODE 값은 스크립트를 어떻게 호출했는지, exit 키워드를 썼는지에 따라 달라져요:
- 스크립트가
exit키워드를 쓰면$LASTEXITCODE는 그exit키워드가 지정한 값이 돼요. 자세한 내용은 about_Language_Keywords를 참고하세요. - 스크립트를
./Test.ps1처럼 직접 호출하거나 call operator(으)로& ./Test.ps1처럼 호출하면, 다음 경우가 아니면$LASTEXITCODE값은 바뀌지 않아요.- 스크립트가
exit키워드를 쓰는 다른 스크립트를 호출 - 스크립트가 네이티브 명령을 호출
- 스크립트가
exit키워드 사용
- 스크립트가
File매개변수로pwsh를 써서 스크립트를 호출하면$LASTEXITCODE는 이렇게 설정돼요.- 예외로 종료되면
1 - 스크립트에서
exit키워드를 쓰면 그exit키워드가 지정한 값 - 정상 완료되면
0
- 예외로 종료되면
Command매개변수로pwsh를 써서 스크립트를 호출하면$LASTEXITCODE는 이렇게 설정돼요.- 예외로 종료되거나 마지막 명령 결과가
$?를$false로 만들면1 - 정상 완료되고 마지막 명령 결과가
$?를$true로 만들면0
- 예외로 종료되거나 마지막 명령 결과가
File 매개변수와 Command 매개변수에 대한 자세한 내용은 about_Pwsh를 참고하세요.
$Matches
$Matches 변수는 -match·-notmatch 연산자와 함께 동작해요. scalar(으)로 -match나 -notmatch 연산자에 입력을 넣었을 때 둘 중 하나라도 일치를 감지하면 불리언 값을 반환하면서 $Matches 자동 변수에 일치한 문자열 값들의 해시 테이블을 채워요. $Matches 해시 테이블은 -match 연산자와 정규식을 쓸 때 캡처로 채워질 수도 있어요.
-match 연산자에 대한 자세한 내용은 about_Comparison_Operators를 참고하고, 정규식에 대한 내용은 about_Regular_Expressions를 참고하세요.
$Matches 변수는 -Regex 매개변수를 쓴 switch 문에서도 동작해요. -match·-notmatch 연산자와 같은 방식으로 값이 채워져요. switch 문에 대한 자세한 내용은 about_Switch를 참고하세요.
참고 — 세션에서
$Matches에 값이 채워지면 다른 일치가 덮어쓰기 전까지 그 일치 값을 유지해요.-match를 다시 썼는데 일치가 없으면$Matches가$null로 초기화되지는 않아요. 다른 일치가 생기기 전까지 이전에 일치한 값이$Matches에 남아 있어요.
$MyInvocation
현재 명령에 대한 정보, 이름, 매개변수, 매개변수 값, 그리고 현재 명령을 호출한 스크립트 이름 같은 호출 방식 정보를 담아요. $MyInvocation은 스크립트·함수·스크립트블록에서만 값이 채워져요. 현재 스크립트 안에서 $MyInvocation이 반환하는 System.Management.Automation.InvocationInfo 객체의 정보를 쓸 수 있어요. 예를 들어 함수 이름($MyInvocation.MyCommand.Name)으로 현재 명령을 식별할 수 있죠. 현재 스크립트 이름을 찾을 때 유용해요.
파워셸 3.0부터 MyInvocation에 다음 새 속성이 생겼어요.
PSScriptRoot— 현재 명령을 호출한 스크립트의 전체 경로를 담아요. 호출자가 스크립트일 때만 값이 채워져요.PSCommandPath— 현재 명령을 호출한 스크립트의 전체 경로와 파일 이름을 담아요. 호출자가 스크립트일 때만 값이 채워져요.
$PSScriptRoot·$PSCommandPath 자동 변수와 달리, $MyInvocation 자동 변수의 PSScriptRoot·PSCommandPath 속성은 현재 스크립트가 아니라 호출자(호출 스크립트)에 대한 정보를 담아요.
$NestedPromptLevel
현재 프롬프트 수준을 담아요. 0은 원래 프롬프트 수준을 나타내요. 중첩 수준에 들어가면 값이 증가하고, 나가면 감소해요.
예를 들어 $Host.EnterNestedPrompt 메서드를 쓰면 파워셸이 중첩 명령 프롬프트를 띄워요. 파워셸 디버거에서 중단점에 도달할 때도 중첩 명령 프롬프트가 나타나요.
중첩 프롬프트에 들어가면 파워셸이 현재 명령을 일시 중지하고 실행 컨텍스트를 저장한 다음 $NestedPromptLevel 변수 값을 증가시켜요. 추가 중첩 명령 프롬프트(최대 128단계)를 만들거나 원래 명령 프롬프트로 돌아가려면 명령을 완료하거나 exit를 입력하면 돼요.
$NestedPromptLevel 변수로 프롬프트 수준을 추적할 수 있어요. 이 값을 포함하는 대체 파워셸 명령 프롬프트를 만들어서 항상 보이게 할 수도 있어요.
$null
$null은 null 또는 빈 값을 담는 자동 변수예요. 명령과 스크립트에서 없거나 정의되지 않은 값을 나타낼 때 쓸 수 있어요.
파워셸은 $null을 값이 있는 객체, 즉 자리 표시자로 취급하므로 값 컬렉션에서 빈 값을 나타내는 데 쓸 수 있어요. 예를 들어 $null이 컬렉션에 포함되면 객체 하나로 세어져요.
$a = "one", $null, "three"
$a.Count
3
$null 변수를 ForEach-Object cmdlet으로 파이프하면 다른 객체처럼 $null에 대한 값을 만들어요.
"one", $null, "three" | ForEach-Object {"Hello " + $_}
Hello one
Hello
Hello three
그래서 $null로 "매개변수 값 없음"을 뜻할 수는 없어요. $null 매개변수 값은 기본 매개변수 값을 덮어써요.
하지만 파워셸이 $null 변수를 자리 표시자로 취급하므로, $null이 무시된다면 동작하지 않을 다음 같은 스크립트에서 쓸 수 있어요.
$calendar = @($null, $null, "Meeting", $null, $null, "Team Lunch", $null)
$days = "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday"
$currentDay = 0
foreach($day in $calendar)
{
if($day -ne $null)
{
"Appointment on $($days[$currentDay]): $day"
}
$currentDay++
}
Appointment on Tuesday: Meeting
Appointment on Friday: Team lunch
$PID
현재 파워셸 세션을 호스팅하는 프로세스의 프로세스 식별자(PID)를 담아요.
$PROFILE
현재 사용자와 현재 호스트 애플리케이션의 파워셸 프로필 전체 경로를 담아요. 명령에서 이 변수로 프로필을 나타낼 수 있어요. 예를 들어 프로필이 만들어졌는지 확인하는 명령에 쓸 수 있어요:
Test-Path $PROFILE
아니면 프로필을 만드는 명령에 쓸 수도 있어요:
New-Item -ItemType File -Path $PROFILE -Force
notepad.exe에서 프로필을 여는 명령에도 쓸 수 있어요:
notepad.exe $PROFILE
$PSBoundParameters
스크립트나 함수에 전달된 매개변수와 그 현재 값의 사전(dictionary)을 담아요. 이 변수는 스크립트나 함수처럼 매개변수가 선언된 범위에서만 값을 가져요. 매개변수의 현재 값을 표시하거나 변경하고, 다른 스크립트나 함수에 매개변수 값을 전달하는 데 쓸 수 있어요.
이 예시에서 Test2 함수는 $PSBoundParameters를 Test1 함수에 전달해요. $PSBoundParameters는 Key와 Value 형식으로 표시돼요.
function Test1 {
param($a, $b)
# Display the parameters in dictionary format.
$PSBoundParameters
}
function Test2 {
param($a, $b)
# Run the Test1 function with $a and $b.
Test1 @PSBoundParameters
}
Test2 -a Power -b Shell
Key Value
--- -----
a Power
b Shell
$PSCmdlet
실행 중인 cmdlet이나 고급 함수를 나타내는 객체를 담아요.
cmdlet이나 함수 코드에서 이 객체의 속성과 메서드를 써서 사용 조건에 대응할 수 있어요. 예를 들어 ParameterSetName 속성은 사용 중인 매개변수 집합 이름을 담고, ShouldProcess 메서드는 cmdlet에 WhatIf와 Confirm 매개변수를 동적으로 추가해요.
$PSCmdlet 자동 변수에 대한 자세한 내용은 about_Functions_CmdletBindingAttribute와 about_Functions_Advanced를 참고하세요.
$PSCommandPath
실행 중인 스크립트의 전체 경로와 파일 이름을 담아요. 이 변수는 모든 스크립트에서 유효해요.
$PSCulture
파워셸 7부터 $PSCulture는 현재 파워셸 런스페이스(세션)의 문화(culture)를 반영해요. 파워셸 런스페이스에서 문화가 바뀌면 해당 런스페이스의 $PSCulture 값도 업데이트돼요.
문화는 숫자·통화·날짜 같은 항목의 표시 형식을 결정하며 System.Globalization.CultureInfo 객체에 저장돼요. Get-Culture로 컴퓨터의 문화를 표시할 수 있어요. $PSCulture는 Name 속성 값을 담아요.
$PSDebugContext
디버깅 중에는 이 변수가 디버깅 환경에 대한 정보를 담아요. 그 외에는 null 값을 담아요. 그래서 디버거가 제어권을 쥐고 있는지 확인하는 데 쓸 수 있어요. 값이 채워지면 Breakpoints와 InvocationInfo 속성이 있는 PsDebugContext 객체를 담아요. InvocationInfo 속성에는 Location 속성을 포함해 유용한 속성이 여러 개 있어요. Location 속성은 디버깅 중인 스크립트의 경로를 나타내요.
$PSEdition
$PSVersionTable.PSEdition과 같은 값을 담아요. $PSVersionTable은 못 쓰는 모듈 매니페스트 파일에서 이 변수를 쓸 수 있어요.
$PSHOME
파워셸 설치 디렉터리의 전체 경로를 담아요. Windows에서는 보통 C:\Program Files\PowerShell\7이에요. 파워셸 파일 경로에서 이 변수를 쓸 수 있어요. 예를 들어 다음 명령은 개념 도움말 항목에서 Help라는 단어를 검색해요:
Select-String -Pattern Help -Path $PSHOME\en-US\*.txt
$PSItem
$_와 같아요. 파이프라인에서 현재 객체를 담아요. 파이프라인의 모든 객체마다 어떤 작업을 하는 명령에서 이 변수를 쓸 수 있어요. 자세한 내용은 about_PSItem를 참고하세요.
$PSScriptRoot
실행 중인 스크립트의 부모 디렉터리 전체 경로를 담아요.
파워셸 2.0에서는 이 변수가 스크립트 모듈(.psm1)에서만 유효했지만, 파워셸 3.0부터는 모든 스크립트에서 유효해요.
$PSSenderInfo
PSSession을 시작한 사용자에 대한 정보(사용자 ID와 원본 컴퓨터의 표준 시간대 포함)를 담아요. 이 변수는 PSSession에서만 쓸 수 있어요.
$PSSenderInfo 변수에는 사용자가 구성할 수 있는 ApplicationArguments 속성이 있는데, 기본적으로 원본 세션의 $PSVersionTable만 담아요. ApplicationArguments 속성에 데이터를 추가하려면 New-PSSessionOption cmdlet의 ApplicationArguments 매개변수를 쓰면 돼요.
중요 — 이 속성은 클라이언트가 명시적으로 제공한 데이터라서, 이걸 보안 판단에 쓰면 공격자가 인가 제어를 우회할 수 있어요. 이 데이터를 신뢰 판단에 절대 쓰지 마세요. 다른 애플리케이션 로직에 쓸 때는 Validate all user input를 참고하세요.
$PSUICulture
운영체제에 구성된 사용자 인터페이스(UI) 문화의 이름을 담아요. UI 문화는 메뉴나 메시지 같은 UI 요소에 쓰는 텍스트 문자열을 결정해요. 이것은 시스템의 System.Globalization.CultureInfo.CurrentUICulture.Name 속성 값이에요. 시스템의 System.Globalization.CultureInfo 객체를 얻으려면 Get-UICulture cmdlet을 쓰면 돼요.
$PSVersionTable
현재 세션에서 실행 중인 파워셸 버전에 대한 세부 정보를 표시하는 읽기 전용 해시 테이블을 담아요. 이 테이블은 다음 항목들을 포함해요:
PSVersion— 파워셸 버전 번호PSEdition— 파워셸 4 이하, 그리고 전체 기능 Windows 버전의 파워셸 5.1에서는'Desktop'값을 가져요. 파워셸 6 이상, 그리고 Windows Nano Server나 Windows IoT 같은 축소 기능 버전의 Windows 파워셸 5.1에서는Core값을 가져요.GitCommitId— GitHub의 소스 파일 커밋 IDOS— 파워셸이 실행 중인 운영체제 설명Platform— 운영체제가 실행 중인 플랫폼. Linux와 macOS에서는 값이Unix예요.$IsMacOS와$IsLinux를 참고하세요.PSCompatibleVersions— 현재 버전과 호환되는 파워셸 버전들PSRemotingProtocolVersion— 파워셸 원격 관리 프로토콜 버전SerializationVersion— 직렬화 메서드 버전WSManStackVersion— WS-Management 스택 버전 번호
$PWD
현재 파워셸 런스페이스의 현재 디렉터리 위치 전체 경로를 나타내는 경로 객체를 담아요.
참고 — 파워셸은 프로세스당 여러 런스페이스를 지원해요. 각 런스페이스는 자신만의 현재 디렉터리를 가져요. 이건 프로세스의 현재 디렉터리인
[System.Environment]::CurrentDirectory와 달라요.
$Sender
이 이벤트를 발생시킨 객체를 담아요. 이 변수는 이벤트 등록 명령의 Action 블록 안에서만 값이 채워져요. 이 변수 값은 Get-Event가 반환하는 PSEventArgs 객체의 Sender 속성에서도 확인할 수 있어요.
$ShellId
현재 셸의 식별자를 담아요.
$StackTrace
가장 최근 오류에 대한 스택 추적을 담아요.
$switch
switch 문의 열거자(결과 값이 아니라)를 담아요. $switch 변수는 switch 문이 실행되는 동안에만 존재하고, switch 문 실행이 끝나면 삭제돼요. 자세한 내용은 about_Switch를 참고하세요. 열거자는 루프 값을 가져오거나 현재 반복을 바꾸는 데 쓸 수 있는 속성과 메서드를 담고 있어요. 자세한 내용은 Using Enumerators를 참고하세요.
$this
$this 변수는 클래스를 확장하는 스크립트블록에서 클래스 인스턴스 자신을 가리킬 때 써요.
파워셸의 확장 가능 형식 시스템(ETS)은 스크립트블록으로 클래스에 속성을 추가할 수 있게 해줘요. 스크립트 속성이나 스크립트 메서드를 정의하는 스크립트블록에서 $this 변수는 확장 대상 클래스의 객체 인스턴스를 가리켜요. 예를 들어 파워셸은 ETS로 FileInfo 클래스에 BaseName 속성을 추가해요.
PS> Get-ChildItem .\README.md | Get-Member BaseName | Format-List
TypeName : System.IO.FileInfo
Name : BaseName
MemberType : ScriptProperty
Definition : System.Object BaseName {get=if ($this.Extension.Length -gt 0)
{$this.Name.Remove($this.Name.Length - $this.Extension.Length
)}else{$this.Name};}
자세한 내용은 about_Types.ps1xml를 참고하세요. 파워셸 클래스에서 $this 변수는 클래스 인스턴스 객체 자신을 가리켜서, 클래스에 정의된 속성과 메서드에 접근할 수 있게 해줘요. 자세한 내용은 about_Classes를 참고하세요.
$this 변수는 스크립트블록을 이벤트 처리기 델리게이트로 받는 .NET 이벤트 클래스에서도 써요. 이 시나리오에서 $this는 이벤트를 발생시킨 객체, 즉 이벤트 보낸 사람을 나타내요.
$true
True를 담아요. 명령과 스크립트에서 True를 나타낼 때 이 변수를 쓸 수 있어요.
열거자 사용하기
$input, $foreach, $switch 변수는 모두 포함하는 코드 블록이 처리하는 값들을 순회하는 데 쓰는 열거자예요.
열거자는 순회를 진행·초기화하거나 순회 값을 가져오는 데 쓸 수 있는 속성과 메서드를 담아요. 열거자를 직접 조작하는 건 좋은 방법이 아니에요.
루프 안에서는 흐름 제어 키워드 break와 continue를 쓰는 게 낫고, 파이프라인 입력을 받는 함수에서는 ValueFromPipeline이나 ValueFromPipelineByPropertyName 속성을 가진 매개변수를 쓰는 게 좋은 방법이에요. 자세한 내용은 about_Functions_Advanced_Parameters를 참고하세요.
MoveNext
MoveNext 메서드는 열거자를 컬렉션의 다음 요소로 진행시켜요. MoveNext는 열거자가 성공적으로 진행되면 True, 컬렉션 끝을 지났으면 False를 반환해요.
참고 —
MoveNext가 반환하는Boolean값은 출력 스트림으로 보내져요.[void]로 형변환하거나 Out-Null(으)로 파이프하면 출력을 막을 수 있어요.
$input.MoveNext() | Out-Null
[void]$input.MoveNext()
Reset
Reset 메서드는 열거자를 컬렉션의 첫 요소 이전인 초기 위치로 설정해요.
Current
Current 속성은 컬렉션(또는 파이프라인)에서 열거자의 현재 위치에 있는 요소를 가져와요. Current 속성은 MoveNext를 호출할 때까지 같은 속성을 계속 반환해요.
예시
예시 1 — $input 변수 사용하기
다음 예시에서 $input 변수에 접근하면 process 블록이 다음에 실행될 때까지 변수가 비워져요. Reset 메서드를 쓰면 $input 변수가 현재 파이프라인 값으로 초기화돼요.
function Test
{
begin
{
$i = 0
}
process
{
"Iteration: $i"
$i++
"`tInput: $input"
"`tAccess Again: $input"
$input.Reset()
"`tAfter Reset: $input"
}
}
"one","two" | Test
Iteration: 0
Input: one
Access Again:
After Reset: one
Iteration: 1
Input: two
Access Again:
After Reset: two
process 블록은 접근하지 않아도 $input 변수를 자동으로 진행시켜요.
$skip = $true
function Skip
{
begin
{
$i = 0
}
process
{
"Iteration: $i"
$i++
if ($skip)
{
"`tSkipping"
$skip = $false
}
else
{
"`tInput: $input"
}
}
}
"one","two" | Skip
Iteration: 0
Skipping
Iteration: 1
Input: two
예시 2 — process 블록 밖에서 $input 사용하기
process 블록 밖에서는 $input 변수가 함수로 파이프된 모든 값을 나타내요.
$input변수에 접근하면 모든 값을 비워요.Reset메서드는 전체 컬렉션을 초기화해요.Current속성은 절대 값이 채워지지 않아요.MoveNext메서드는 컬렉션을 진행할 수 없으므로false를 반환해요.MoveNext를 호출하면$input변수를 비워요.
Function All
{
"All Values: $input"
"Access Again: $input"
$input.Reset()
"After Reset: $input"
$input.MoveNext() | Out-Null
"After MoveNext: $input"
}
"one","two","three" | All
All Values: one two three
Access Again:
After Reset: one two three
After MoveNext:
예시 3 — $input.Current 속성 사용하기
Current 속성을 쓰면 Reset 메서드를 쓰지 않고 현재 파이프라인 값에 여러 번 접근할 수 있어요. process 블록은 MoveNext 메서드를 자동으로 호출하지 않아요.
Current 속성은 명시적으로 MoveNext를 호출하지 않으면 절대 값이 채워지지 않아요. Current 속성은 process 블록 안에서 값을 비우지 않고 여러 번 접근할 수 있어요.
function Current
{
begin
{
$i = 0
}
process
{
"Iteration: $i"
$i++
"`tBefore MoveNext: $($input.Current)"
$input.MoveNext() | Out-Null
"`tAfter MoveNext: $($input.Current)"
"`tAccess Again: $($input.Current)"
}
}
"one","two" | Current
Iteration: 0
Before MoveNext:
After MoveNext: one
Access Again: one
Iteration: 1
Before MoveNext:
After MoveNext: two
Access Again: two
예시 4 — $foreach 변수 사용하기
$input 변수와 달리 $foreach 변수는 직접 접근하면 항상 컬렉션의 모든 항목을 나타내요. 현재 컬렉션 요소에 접근할 때는 Current 속성을 쓰고, 값을 바꿀 때는 Reset과 MoveNext 메서드를 쓰면 돼요.
참고 —
foreach루프의 각 반복은MoveNext메서드를 자동으로 호출해요.
다음 루프는 두 번만 실행돼요. 두 번째 반복에서 반복이 완료되기 전에 컬렉션이 세 번째 요소로 이동해요. 두 번째 반복 후에는 더 이상 순회할 값이 없으므로 루프가 종료돼요. MoveNext 속성은 컬렉션을 순회할 변수($Num)에는 영향을 주지 않아요.
$i = 0
foreach ($num in ("one","two","three"))
{
"Iteration: $i"
$i++
"`tNum: $num"
"`tCurrent: $($foreach.Current)"
if ($foreach.Current -eq "two")
{
"Before MoveNext (Current): $($foreach.Current)"
$foreach.MoveNext() | Out-Null
"After MoveNext (Current): $($foreach.Current)"
"Num hasn't changed: $num"
}
}
Iteration: 0
Num: one
Current: one
Iteration: 1
Num: two
Current: two
Before MoveNext (Current): two
After MoveNext (Current): three
Num hasn't changed: two
Reset 메서드를 쓰면 컬렉션의 현재 요소가 초기화돼요. 다음 예시는 Reset 메서드가 호출되기 때문에 처음 두 요소를 두 번 순회해요. 처음 두 번 루프 후에는 if 문이 실패해서 루프가 세 요소 모두를 정상적으로 순회해요.
중요 — 이 경우 무한 루프가 될 수 있어요.
$stopLoop = 0
foreach ($num in ("one","two", "three"))
{
("`t" * $stopLoop) + "Current: $($foreach.Current)"
if ($num -eq "two" -and $stopLoop -lt 2)
{
$foreach.Reset()
("`t" * $stopLoop) + "Reset Loop: $stopLoop"
$stopLoop++
}
}
Current: one
Current: two
Reset Loop: 0
Current: one
Current: two
Reset Loop: 1
Current: one
Current: two
Current: three
예시 5 — $switch 변수 사용하기
$switch 변수는 $foreach 변수와 정확히 같은 규칙을 가져요. 다음 예시는 열거자 개념을 모두 보여줘요.
참고 —
MoveNext메서드 뒤에break문이 없는데도NotEvaluated케이스가 절대 실행되지 않는 점을 눈여겨보세요.
$values = "Start", "MoveNext", "NotEvaluated", "Reset", "End"
$stopInfinite = $false
switch ($values)
{
"MoveNext" {
"`tMoveNext"
$switch.MoveNext() | Out-Null
"`tAfter MoveNext: $($switch.Current)"
}
# This case is never evaluated.
"NotEvaluated" {
"`tAfterMoveNext: $($switch.Current)"
}
"Reset" {
if (!$stopInfinite)
{
"`tReset"
$switch.Reset()
$stopInfinite = $true
}
}
default {
"Default (Current): $($switch.Current)"
}
}
Default (Current): Start
MoveNext
After MoveNext: NotEvaluated
Reset
Default (Current): Start
MoveNext
After MoveNext: NotEvaluated
Default (Current): End
더 알아보기
- about_Functions
- about_Functions_Advanced
- about_Functions_Advanced_Methods
- about_Functions_Advanced_Parameters
- about_Functions_OutputTypeAttribute
- about_Functions_CmdletBindingAttribute
- about_Hash_Tables
- about_Preference_Variables
- about_Splatting
- about_Variables
이 콘텐츠의 원본은 GitHub에서 찾을 수 있어요. 이슈와 풀 리퀘스트를 만들고 검토할 수도 있죠. 자세한 내용은 our contributor guide를 참고하세요.
_파워셸 Open a documentation issue Provide product feedback
마지막 업데이트: 2026-04-02