about_Parameter_Binding

about_Parameter_Binding

PowerShell이 명령을 실행할 때 "어떤 매개변수에 어떤 값을 넣을까"를 결정하는 과정, 바로 **매개변수 바인딩(Parameter Binding)**을 다뤄요. 명령줄에서 준 값이 언제, 어떤 순서로 매개변수에 들어가는지 머릿속에 그림이 그려지도록 차근차근 설명해 드릴게요.

출처: about_Parameter_Binding - Microsoft Learn

본문

짧게 말하면

매개변수 바인딩이란 PowerShell이 어떤 매개변수 집합(parameter set)을 쓰고 있는지 판별하고, 명령의 매개변수에 값을 연결(bind)하는 과정이에요. 이 값은 명령줄에서 올 수도 있고, 파이프라인에서 올 수도 있어요.

자세히 알아보기

바인딩은 먼저 명령줄 인수부터 처리하는 걸로 시작해요.

이름 있는 매개변수(Named parameters) 바인딩

명령줄에서 따옴표로 감싸지 않고 대시(-)로 시작하는 토큰을 찾아요. 그 토큰이 콜론(:)으로 끝나면 인수가 필수예요. 콜론이 없다면 해당 매개변수의 타입을 보고 인수가 필요한지 판단해요. 값이 필요하다면 인수의 타입을 매개변수가 요구하는 타입으로 변환을 시도하고, 변환이 성공하면 그 매개변수에 바인딩해요.

위치 매개변수(Positional parameters) 바인딩

아직 쓰이지 않은 명령줄 인수가 남아 있다면, 위치 매개변수를 받는 바인딩되지 않은 매개변수를 찾아서 그 값들을 연결해 봐요.

명령줄 인수를 바인딩한 다음에는 파이프라인 입력 바인딩을 시도해요. 파이프라인에서 값을 받아들이는 매개변수는 다음 두 속성 중 하나(또는 둘 다)를 가져요.

  • ValueFromPipeline — 파이프라인의 값을 타입을 기준으로 매개변수에 바인딩해요. 인수의 타입이 매개변수의 타입과 일치해야 해요.
  • ValueFromPipelineByPropertyName — 파이프라인의 값을 이름을 기준으로 매개변수에 바인딩해요. 파이프라인의 객체에 매개변수 이름(또는 그 별칭 중 하나)과 일치하는 속성이 있어야 해요. 속성의 타입이 매개변수의 타입과 일치하거나 변환 가능해야 하고요.

PowerShell은 파이프라인 입력을 다음 순서대로 바인딩하려고 해요.

  1. 타입 변환 없이 ValueFromPipeline 매개변수 바인딩 시도 — 파이프라인에서 값으로 바인딩하되 타입이 정확히 일치할 때예요. 명령에 파이프라인 입력이 있고 아직 바인딩되지 않은 매개변수가 남아 있다면, 타입이 정확히 일치하는 매개변수를 찾아 연결해요.

  2. 타입 변환 없이 ValueFromPipelineByPropertyName 매개변수 바인딩 시도 — 값 기준으로 일치하는 게 없다면, 이제 이름 기준으로 정확히 일치하는 걸 찾아요. 입력 객체에서 매개변수 이름이나 그 별칭과 일치하는 속성을 찾고, 타입이 정확히 일치하면 바인딩해요.

  3. 타입 변환을 사용해 ValueFromPipeline 매개변수 바인딩 시도 — 파이프라인 입력이 아직 바인딩되지 않았다면, 파이프라인 입력을 요구되는 타입으로 변환해 봐요. 변환이 실패하면 그 매개변수는 바인딩되지 않아요.

  4. 타입 변환을 사용해 ValueFromPipelineByPropertyName 매개변수 바인딩 시도 — 속성의 이름이 매개변수 이름이나 그 별칭 중 하나와 일치해야 해요. 입력 타입이 일치하지 않으면, 입력을 일치하는 타입으로 변환을 시도해요. 변환이 실패하면 그 매개변수는 바인딩되지 않아요.

매개변수 바인딩 시각화하기

매개변수 바인딩 문제를 디버깅하는 건 꽤 까다로울 수 있어요. 이때 Trace-Command cmdlet을 쓰면 매개변수 바인딩 과정을 직접 눈으로 볼 수 있어요. 간단한 파이프라인에 대한 매개변수 바인딩을 추적하는 예시를 볼게요.

Trace-Command -PSHost -Name ParameterBinding -Expression {
    Get-Item *.txt | Remove-Item
}

출력은 Expression 안 명령들에 대한 매개변수 바인딩 과정의 모든 단계를 보여줘요. 출력이 다소 장황할 수 있지만, 매개변수가 예상대로 바인딩되지 않는 이유를 이해하는 데 큰 도움이 돼요. 전체 예시는 Visualize parameter binding 문서에서 확인할 수 있어요.

더 알아보기