확장 형식 시스템 개요

PowerShell은 PSObject 개체를 사용하여 두 가지 방법으로 개체 형식을 확장합니다. 먼저 PSObject 개체는 특정 개체 형식의 다양한 보기를 표시하는 방법을 제공합니다. 이를 개체의 적응된 뷰를 표시하는 것이라고 합니다. 둘째, PSObject 개체는 기존 개체에 멤버를 추가하는 방법을 제공합니다. 기본 개체라고 하는 기존 개체를 래핑하여 PSObject 개체는 스크립트 및 cmdlet 개발자가 셸 내에서 .NET 개체를 조작하는 데 사용할 수 있는 ETS(확장 형식 시스템)를 제공합니다.

Cmdlet 및 스크립트 개발 문제

ETS는 다음 두 가지 근본적인 문제를 해결합니다.

첫째, 일부 .NET 개체에는 cmdlet 간의 데이터 역할을 하는 데 필요한 기본 동작이 없습니다.

  • 일부 .NET 개체는 멤버가 포함하는 데이터를 설명하는 "메타" 개체(예: WMI 개체, ADO 개체 및 XML 개체)입니다. 그러나 스크립팅 환경에서는 포함된 데이터에 대한 설명이 아니라 가장 흥미로운 포함된 데이터입니다. ETS는 기본 .NET 개체에 예상되는 기본 의미 체계를 적용하는 어댑터의 개념을 도입하여 이 문제를 해결합니다.
  • 일부 .NET 개체 멤버는 일관되지 않은 이름을 지정하거나, 부족한 공용 멤버 집합을 제공하거나, 부족한 기능을 제공합니다. ETS는 추가 멤버를 사용하여 .NET 개체를 확장하는 기능을 도입하여 이 문제를 해결합니다.

둘째, PowerShell 스크립팅 언어는 변수를 특정 형식으로 선언할 필요가 없다는 형식 없는. 즉, 스크립트 개발자가 만드는 변수는 기본적으로 형식이 없는 . 그러나 PowerShell 시스템은 결과 출력 또는 정렬과 같은 기본 작업에 대해 작동할 형식 이름을 갖는 것에 의존한다는 측면에서 "형식 기반"입니다.

따라서 스크립트 개발자는 변수 중 하나의 형식을 명시하고 속성과 메서드를 포함하고 형식 기반 시스템에 참여할 수 있는 동적으로 형식화된 자체 "개체" 집합을 빌드할 수 있어야 합니다. ETS는 형식을 동적으로 명시하고 멤버를 동적으로 추가할 수 있는 스크립팅 언어에 공통 개체를 제공하여 이 문제를 해결합니다.

기본적으로 ETS는 스크립팅 언어에서 모든 개체 액세스의 기초 역할을 하고 cmdlet 개발자를 위한 표준 추상화를 제공하는 PSObject 개체를 제공하여 앞에서 언급한 문제를 해결합니다.

Cmdlet 개발자

cmdlet 개발자를 위해 ETS는 다음과 같은 지원을 제공합니다.

  • PSObject 개체를 사용하여 일반적인 방식으로 개체에 대해 작업할 추상화입니다. 또한 ETS는 필요한 경우 이러한 추상화 과거 드릴 기능을 제공합니다.
  • 잘 알려진 확장 멤버 집합을 사용하여 개체 형식의 형식 지정, 정렬, serialization 및 기타 시스템 조작에 대한 기본 동작을 만드는 메커니즘입니다.
  • LanguagePrimitives 개체를 사용하는 스크립트 언어와 동일한 의미 체계를 사용하여 모든 개체에 대해 작동하는 수단입니다.
  • 시스템의 나머지 부분도 효과적으로 작동할 수 있도록 해시 테이블을 동적으로 "입력"하는 방법입니다.

스크립트 개발자

스크립트 개발자를 위해 ETS는 다음과 같은 지원을 제공합니다.

  • 동일한 구문($a.x)을 사용하여 기본 개체 형식을 참조하는 기능입니다.
  • PSObject 개체에서 제공하는 추상화 외에 액세스할 수 있는 기능(예: 적응 멤버만 액세스하거나 기본 개체 자체에 액세스).
  • 개체 인스턴스 또는 형식의 서식, 정렬, serialization 및 기타 조작을 제어하는 잘 알려진 멤버를 정의하는 기능입니다.
  • 개체의 이름을 특정 형식으로 지정하여 형식 기반 멤버의 상속을 제어하는 수단입니다.
  • 확장 멤버를 추가, 제거 및 수정하는 기능입니다.
  • 필요한 경우 PSObject 개체 자체를 조작하는 기능입니다.

PSObject 클래스

PSObject 개체는 스크립팅 언어에서 모든 개체 액세스의 기초이며 cmdlet 개발자를 위한 표준 추상화를 제공합니다. 여기에는 기본 개체(.NET 개체) 및 모든 인스턴스 멤버(특정 개체 인스턴스에 있는 멤버, 특히 확장된 멤버)가 포함되어 있지만 동일한 형식의 다른 개체에는 반드시 있는 것은 아닙니다. 기본 개체의 형식에 따라 PSObject 개체는 형식 기반 확장 멤버뿐만 아니라 적응 멤버에 대한 암시적 및 명시적 액세스도 제공할 수 있습니다.

PSObject 개체는 다음과 같은 메커니즘을 제공합니다.

  • 기본 개체를 사용하거나 사용하지 않고 PSObject 생성하는 기능입니다.
  • 일반적인 조회 알고리즘을 통해 생성된 각 PSObject 개체의 모든 멤버에 액세스할 수 있는 기능과 필요할 때 해당 알고리즘을 재정의하는 기능입니다.
  • 스크립트와 cmdlet이 기본 개체의 형식에 관계없이 동일한 형식 이름으로 유사한 PSObject 개체를 참조할 수 있도록 생성된 PSObject 개체의 형식 이름을 가져와서 설정하는 기능입니다.

PSObject를 생성하는 방법

다음 목록에서는 PSObject 개체를 만드는 방법을 설명합니다.

  • PSObject .#ctor 생성자를 호출하면 PSCustomObject의 기본 개체를 사용하여 새 PSObject 개체가 만들어집니다. 이 형식의 기본 개체는 PSObject 개체에 의미 있는 기본 개체가 없음을 나타냅니다. 그러나 이 유형의 기본 개체를 사용하는 PSObject 개체는 cmdlet 개발자가 확장 멤버를 추가하여 유용하게 사용할 수 있는 속성 모음을 제공합니다.

개발자는 개체 형식 이름을 지정할 수도 있습니다. 이 개체를 통해 확장 멤버를 다른 PSObject 동일한 형식 이름의 개체와 공유할 수 있습니다.

  • PSObject .#ctor(System.Object) 생성자를 호출하면 System.Object 형식의 기본 개체가 있는 새 PSObject 개체가 만들어집니다.

    이 경우 만든 개체의 type-name은 기본 개체의 파생 계층 구조 컬렉션입니다. 예를 들어 ProcessInfo 기본 개체를 포함하는 PSObject 형식 이름에는 다음 이름이 포함됩니다.

    • System.Diagnostics.Process
    • System.ComponentModel.Component
    • System.MarshalByRefObject
    • System.Object
  • PSObject 호출합니다. AsPSObject(System.Object) 메서드는 제공된 개체를 기반으로 새 PSObject 개체를 만듭니다.

    제공된 개체가 System.Object 형식인 경우 제공된 개체는 새 PSObject 개체의 기본 개체로 사용됩니다. 제공된 개체가 이미 PSObject 개체인 경우 제공된 개체가 있는 그대로 반환됩니다.

기본, 적응형 및 확장 멤버

개념적으로 ETS는 다음 용어를 사용하여 기본 개체의 원래 멤버와 PowerShell에서 추가한 멤버 간의 관계를 표시합니다. PSObject 개체에서 사용되는 특정 형식의 멤버에 대한 자세한 내용은 PSObject 클래스참조하세요.

기본 개체 멤버

PSObject 개체를 생성할 때 기본 개체를 지정하면 Members 속성을 통해 기본 개체의 멤버를 사용할 수 있습니다.

적응 멤버

기본 개체가 포함된 데이터를 "설명"하는 제네릭 방식으로 데이터를 포함하는 메타 개체인 경우 ETS는 해당 개체를 PSObject 개체의 적응 멤버를 통해 데이터에 직접 액세스할 수 있는 뷰에 맞게 조정합니다. Members 속성을 통해 적응 멤버 및 기본 개체 멤버에 액세스합니다.

확장 멤버

기본 개체 또는 PowerShell에서 만든 해당 적응 멤버에서 사용할 수 있는 멤버 외에도 PSObject 스크립팅 환경에서 유용한 추가 정보를 사용하여 원래 기본 개체를 확장하는 확장 멤버를 정의할 수도 있습니다.

예를 들어 powerShell에서 제공하는 모든 핵심 cmdlet(예: Get-Content 및 Set-Content cmdlet)은 Path 매개 변수를 사용합니다. 이러한 cmdlet 및 다른 cmdlet이 서로 다른 형식의 개체에 대해 작동할 수 있도록 해당 개체에 Path 멤버를 추가하여 모두 공통된 방식으로 정보를 지정할 수 있습니다. 이 확장된 Path 멤버는 기본 클래스에 Path 멤버가 없는 경우에도 cmdlet이 모든 형식에 대해 작동할 수 있도록 합니다.

확장 멤버, 적응 멤버 및 기본 개체 멤버는 모두 Members 속성을 통해 액세스됩니다.