about_Automatic_Variables — PowerShell 자동 변수 완전 정복

about_Automatic_Variables — PowerShell 자동 변수 완전 정복

파워셸이 직접 만들어 관리하는 내장 변수들이에요. 주로 읽기 전용으로 쓰라고 만든 거라, 알아두면 스크립트가 훨씬 깔끔해져요.

출처: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_automatic_variables

본문

간단한 설명

파워셸의 상태 정보를 담고 있으면서 파워셸 자체가 만들고 관리하는 변수에 대해 설명하는 문서예요.

자세한 설명

개념적으로 이 변수들은 대부분 읽기 전용으로 봐야 해요. 값을 쓸 수는 있지만, 예전 버전과의 호환성을 지키려면 되도록 쓰지 않는 게 좋아요.

파워셸의 자동 변수 목록이에요:

$$

세션이 받은 마지막 줄에서 맨 마지막 토큰을 담아요.

$?

마지막 명령의 실행 결과를 담아요. 명령이 성공하면 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

$nullnull 또는 빈 값을 담는 자동 변수예요. 명령과 스크립트에서 없거나 정의되지 않은 값을 나타낼 때 쓸 수 있어요.

파워셸은 $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 함수는 $PSBoundParametersTest1 함수에 전달해요. $PSBoundParametersKeyValue 형식으로 표시돼요.

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에 WhatIfConfirm 매개변수를 동적으로 추가해요.

$PSCmdlet 자동 변수에 대한 자세한 내용은 about_Functions_CmdletBindingAttributeabout_Functions_Advanced를 참고하세요.

$PSCommandPath

실행 중인 스크립트의 전체 경로와 파일 이름을 담아요. 이 변수는 모든 스크립트에서 유효해요.

$PSCulture

파워셸 7부터 $PSCulture는 현재 파워셸 런스페이스(세션)의 문화(culture)를 반영해요. 파워셸 런스페이스에서 문화가 바뀌면 해당 런스페이스의 $PSCulture 값도 업데이트돼요.

문화는 숫자·통화·날짜 같은 항목의 표시 형식을 결정하며 System.Globalization.CultureInfo 객체에 저장돼요. Get-Culture로 컴퓨터의 문화를 표시할 수 있어요. $PSCultureName 속성 값을 담아요.

$PSDebugContext

디버깅 중에는 이 변수가 디버깅 환경에 대한 정보를 담아요. 그 외에는 null 값을 담아요. 그래서 디버거가 제어권을 쥐고 있는지 확인하는 데 쓸 수 있어요. 값이 채워지면 BreakpointsInvocationInfo 속성이 있는 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의 소스 파일 커밋 ID
  • OS — 파워셸이 실행 중인 운영체제 설명
  • 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 변수는 모두 포함하는 코드 블록이 처리하는 값들을 순회하는 데 쓰는 열거자예요.

열거자는 순회를 진행·초기화하거나 순회 값을 가져오는 데 쓸 수 있는 속성과 메서드를 담아요. 열거자를 직접 조작하는 건 좋은 방법이 아니에요.

루프 안에서는 흐름 제어 키워드 breakcontinue를 쓰는 게 낫고, 파이프라인 입력을 받는 함수에서는 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 속성을 쓰고, 값을 바꿀 때는 ResetMoveNext 메서드를 쓰면 돼요.

참고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

더 알아보기

이 콘텐츠의 원본은 GitHub에서 찾을 수 있어요. 이슈와 풀 리퀘스트를 만들고 검토할 수도 있죠. 자세한 내용은 our contributor guide를 참고하세요.

_파워셸 Open a documentation issue Provide product feedback

마지막 업데이트: 2026-04-02