다음을 통해 공유


Windows PowerShell 내비게이션 제공자 생성

이 주제는 데이터 저장소를 탐색할 수 있는 Windows PowerShell 내비게이션 제공자를 만드는 방법을 설명합니다. 이 유형의 제공자는 재귀 명령어, 중첩된 컨테이너, 상대 경로를 지원합니다.

비고

이 제공자의 C# 소스 파일(AccessDBSampleProvider05.cs)은 Windows Vista용 Microsoft Windows 소프트웨어 개발 키트와 .NET Framework 3.0 런타임 컴포넌트를 통해 다운로드할 수 있습니다. 다운로드 방법은 Windows PowerShell 설치 방법과 Windows PowerShell SDK를 다운로드하세요. 다운로드한 소스 파일은 PowerShell Samples< 디렉터리에서> 이용할 수 있습니다. 다른 Windows PowerShell 제공자 구현에 대한 자세한 내용은 'Windows PowerShell Provider를 설계하기'를 참조하세요.

여기서 설명한 제공자는 사용자가 Access 데이터베이스를 드라이브로 관리하여 데이터베이스 내 데이터 테이블로 이동할 수 있도록 합니다. 자체 내비게이션 제공자를 만들 때, 드라이브 자격 경로를 내비게이션에 필수로 만들고, 상대 경로를 정규화하며, 데이터 저장소의 항목을 이동하거나, 자식 이름을 얻고, 항목의 상위 경로를 얻으며, 항목이 컨테이너인지 테스트하는 메서드를 구현할 수 있습니다.

주의

이 설계는 데이터베이스가 이름 ID를 가진 필드를 가지고 있고, 필드 타입이 LongInteger임을 가정한다는 점을 유의하세요.

Windows PowerShell 제공자를 정의하세요

Windows PowerShell 내비게이션 제공자는 System.Management.Automation.Provider.NavigationCmdletProvider 기본 클래스에서 파생된 .NET 클래스를 생성해야 합니다. 다음은 이 섹션에서 설명한 내비게이션 제공자의 클래스 정의입니다.

[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : NavigationCmdletProvider

이 제공자에서 System.Management.Automation.Provider.CmdletProviderAttribute 속성에는 두 가지 매개변수가 포함되어 있습니다. 첫 번째 매개변수는 Windows PowerShell에서 사용하는 제공자의 사용자 친화적인 이름을 지정합니다. 두 번째 매개변수는 명령 처리 중에 제공자가 Windows PowerShell 런타임에 노출하는 Windows PowerShell 고유 기능을 지정합니다. 이 제공자에는 Windows PowerShell 특유의 기능이 추가되지 않습니다.

기본 기능 정의

Design Your PS Provider에서 설명된 대로, System.Management.Automation.Provider.NavigationCmdletProvider 기본 클래스는 서로 다른 제공 기능을 제공한 여러 클래스에서 파생되었습니다. 따라서 Windows PowerShell 내비게이션 제공자는 해당 클래스가 제공하는 모든 기능을 정의해야 합니다.

세션별 초기화 정보를 추가하거나 제공자가 사용하는 자원을 해제하는 기능을 구현하려면 기본 PS 제공자 생성(Creating a Basic PS Provider)을 참조하세요. 하지만 대부분의 제공자(여기서 설명된 제공자 포함)는 Windows PowerShell이 제공하는 기본 구현을 사용할 수 있습니다.

Windows PowerShell 드라이브를 통해 데이터 저장소에 접근하려면 System.Management.Automation.Provider.DriveCmdletProvider 기본 클래스의 메서드를 구현해야 합니다. 이러한 방법들을 구현하는 방법에 대한 자세한 내용은 Windows PowerShell Drive Provider를 참조하세요.

데이터 저장소의 항목을 조작하기 위해, 예를 들어 항목 획득, 설정, 삭제 등은 System.Management.Automation.Provider.ItemCmdletProvider 기본 클래스에서 제공하는 메서드를 구현해야 합니다. 이 방법들을 구현하는 방법에 대한 자세한 내용은 Windows PowerShell 항목 제공자 생성(Creating a Windows PowerShell Item Provider)을 참조하세요.

데이터 저장소의 자식 항목이나 그 이름, 그리고 항목을 생성, 복사, 이름 변경, 제거하는 메서드에 접근하려면 System.Management.Automation.Provider.ContainerCmdletProvider 기본 클래스에서 제공하는 메서드를 구현해야 합니다. 이러한 방법들을 구현하는 방법에 대한 자세한 내용은 Windows PowerShell 컨테이너 프로바이저 생성 항목을 참조하세요.

Windows PowerShell 경로 생성

Windows PowerShell 내비게이션 제공자는 데이터 저장소의 항목을 탐색하기 위해 제공자 내부 Windows PowerShell 경로를 사용합니다. 프로바이더-내부 경로를 생성하려면 프로바이더가 Combine-Path 커들렛에서 호출을 지원하기 위해 System.Management.Automation.Provider.NavigationCmdlet.MakePath* 메서드를 구현해야 합니다. 이 방법은 부모와 자식 경로를 결합하여 부모와 자식 경로 사이에 제공자 특화 경로 구분자를 사용합니다.

기본 구현은 "/" 또는 "\"가 경로 구분자로 지정된 경로를 받고, 경로 구분자를 "\"로 정규화하며, 부모와 자식 경로 부분을 그 사이에 분리자와 결합한 후, 결합된 경로를 포함하는 문자열을 반환합니다.

이 내비게이션 제공자는 이 방법을 구현하지 않습니다. 하지만 다음 코드는 System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* 메서드의 기본 구현입니다.

MakePath 구현 시 기억해야 할 사항

System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* 구현에 다음과 같은 조건이 적용될 수 있습니다:

부모 경로 복원

Windows PowerShell 내비게이션 제공자는 System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* 메서드를 구현하여 표시된 전체 또는 부분 프로바이저 특정 경로의 부모 부분을 검색합니다. 이 메서드는 경로의 자식 부분을 제거하고 부모 경로 부분을 반환합니다. 이 매개변수는 root 드라이브의 루트로 가는 완전 자격화된 경로를 지정합니다. 마운트된 드라이브가 검색 작업에 사용되지 않을 경우 이 매개변수는 null이거나 비어 있을 수 있습니다. 루트가 지정되어 있다면, 메서드는 루트와 같은 트리 내의 컨테이너로 가는 경로를 반환해야 합니다.

샘플 내비게이션 제공자는 이 메서드를 덮어쓰지 않고 기본 구현을 사용합니다. "/"와 "\"를 모두 경로 구분자로 사용하는 경로를 수용합니다. 먼저 경로를 "\" 구분자만 가지도록 정규화한 후, 마지막 "\"에서 부모 경로를 분리하고 부모 경로를 반환합니다.

GetParentPath 구현을 기억하기 위해

System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* 메서드 구현은 제공자 네임스페이스의 경로 구분자에서 경로를 렉사적으로 분할해야 합니다. 예를 들어, FileSystem 제공자는 이 방법을 사용해 마지막 "\"을 찾고 구분자 왼쪽에 있는 모든 것을 반환합니다.

자식 경로 이름 조회

내비게이션 제공자는 System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* 메서드를 구현하여 해당 항목의 전체 또는 부분 제공자 전용 경로에 위치한 자식의 이름(리프 요소)을 검색합니다.

샘플 내비게이션 제공자는 이 방법을 덮어쓰지 않습니다. 기본 구현은 아래에 나와 있습니다. "/"와 "\"를 모두 경로 구분자로 사용하는 경로를 수용합니다. 먼저 경로를 "\" 구분자만 갖도록 정규화한 후, 마지막 "\"에서 부모 경로를 분리하고 자식 경로 부분의 이름을 반환합니다.

GetChildName을 구현할 때 기억해야 할 사항

System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* 메서드 구현은 경로 분리자에서 경로를 렉사적으로 분할해야 합니다. 제공된 경로에 경로 구분자가 없다면, 메서드는 수정되지 않은 경로를 반환해야 합니다.

중요합니다

이 메서드 호출에서 제공되는 경로에는 제공자 네임스페이스에서 불법적인 문자가 포함될 수 있습니다. 이 문자들은 아마도 와일드카드 확장이나 정규 표현식 매칭에 사용되며, 이 방법 구현이 이들을 제거해서는 안 됩니다.

아이템이 컨테이너인지 판단하기

내비게이션 제공자는 System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* 메서드를 구현하여 지정된 경로가 컨테이너를 나타내는지 판단할 수 있습니다. 경로가 컨테이너를 나타내면 true로 반환되고, 그렇지 않으면 false로 반환됩니다. 사용자는 제공된 경로에 대해 cmdlet을 Test-Path 사용할 수 있도록 이 메서드가 필요합니다.

다음 코드는 샘플 내비게이션 제공자에서 System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* 구현을 보여줍니다. 이 메서드는 지정된 경로가 올바른지, 테이블이 존재하는지 검증하고, 경로가 컨테이너를 가리키면 true로 반환합니다.

protected override bool IsItemContainer(string path)
{
   if (PathIsDrive(path)) 
   { 
       return true; 
   }
   
   string[] pathChunks = ChunkPath(path);
   string tableName;
   int rowNumber;

   PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
   
   if (type == PathType.Table)
   {
      foreach (DatabaseTableInfo ti in GetTables())
      {
          if (string.Equals(ti.Name, tableName, StringComparison.OrdinalIgnoreCase))
          {
              return true;
          }
      } // foreach (DatabaseTableInfo...
   } // if (pathChunks...

   return false;
} // IsItemContainer

IsItemContainer 구현 시 기억해야 할 점들

내비게이션 제공자 .NET 클래스는 System.Management.Automation.Provider.ProviderCapabilities 의 나열에서 ExpandWildcards, Filter, Include, Exclude 등의 제공자 기능을 선언할 수 있습니다. 이 경우 System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* 구현은 통과된 경로가 요구사항을 충족하는지 확인해야 합니다. 이를 위해 메서드는 적절한 속성, 예를 들어 System.Management.Automation.Provider.CmdletProvider.Exclude* 속성에 접근해야 합니다.

아이템 이동

명령어를 Move-Item 지원하기 위해 내비게이션 제공자는 System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* 메서드를 구현합니다. 이 방법은 매개변수에 path 지정된 항목을 매개변수에 제공 destination 된 경로의 컨테이너로 이동시킵니다.

샘플 내비게이션 제공자는 System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* 메서드를 덮어쓰지 않습니다. 다음은 기본 구현 방식입니다.

MoveItem 구현에 대해 기억해야 할 점

내비게이션 제공자 .NET 클래스는 System.Management.Automation.Provider.ProviderCapabilities 의 나열에서 ExpandWildcards, Filter, Include, Exclude 등의 제공자 기능을 선언할 수 있습니다. 이 경우 System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* 구현은 통과된 경로가 요구사항을 충족하는지 확인해야 합니다. 이를 위해 메서드는 적절한 속성, 예를 들어 CmdletProvider.Exclude 속성에 접근해야 합니다.

기본적으로 이 메서드의 오버라이드는 System.Management.Automation.Provider.CmdletProvider.Force* 속성이 로 설정 true되지 않는 한 기존 객체 위로 객체를 이동하지 않아야 합니다. 예를 들어, FileSystem 제공자는 System.Management.Automation.Provider.CmdletProvider.Force* 속성을 로 설정 true하지 않는 한 기존 C:\bar.txt 파일 위에 C:\temp\abc.txt을 복사하지 않습니다. 매개변수에 destination 지정된 경로가 존재하고 컨테이너라면, System.Management.Automation.Provider.CmdletProvider.Force* 속성은 필요하지 않습니다. 이 경우 System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* 은 매개변수가 나타내는 path 항목을 자식으로 지정한 컨테이너 destination 로 이동해야 합니다.

System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* 메서드의 구현은 데이터 저장소에 변경을 하기 전에 System.Management.Automation.Provider.CmdletProvider.ShouldProcess를 호출하여 반환값을 확인해야 합니다. 이 방법은 시스템 상태에 변화가 있을 때 실행 여부를 확인하는 데 사용됩니다. 예를 들어 파일 삭제 등이 있습니다. System.Management.Automation.Provider.CmdletProvider.ShouldProcess 는 변경할 리소스 이름을 사용자에게 전송하며, Windows PowerShell 런타임은 명령줄 설정이나 선호도 변수를 고려하여 사용자에게 무엇을 표시할지 결정합니다.

System.Management.Automation.Provider.CmdletProvider.ShouldProcess 호출 후 trueSystem.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* 메서드가 System.Management.Automation.Provider.CmdletProvider.WithContinue 메서드를 호출해야 합니다. 이 방법은 사용자가 작업을 계속할지 피드백을 받을 수 있도록 메시지를 보냅니다. 귀하의 제공자는 잠재적으로 위험한 시스템 수정 여부를 추가 점검하기 위해 System.Management.Automation.Provider.CommandletProvider.WithRequired에 전화해야 합니다.

동적 매개변수를 Move-Item 커들렛에 부착하기

때때로 cmdlet이 Move-Item 실행 시 동적으로 제공되는 추가 매개변수를 요구하기도 합니다. 이러한 동적 매개변수를 제공하기 위해 내비게이션 제공자는 System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters* 메서드를 구현하여 지정된 경로의 항목에서 필요한 매개변수 값을 얻고, cmdlet 클래스나 System.Management.Automation.RuntimeDefinedParameterDictionary 객체와 유사한 파싱 속성을 가진 속성과 필드를 반환해야 합니다.

이 내비게이션 제공자는 이 방법을 구현하지 않습니다. 하지만 다음 코드는 System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters*의 기본 구현입니다.

상대 경로의 정규화

내비게이션 제공자는 System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* 메서드를 구현하여 매개변수에 path 표시된 완전 자격화된 경로를 해당 경로 basePath 에 대해 상대적으로 정규화합니다. 이 메서드는 정규화된 경로의 문자열 표현을 반환합니다. 매개변수가 path 존재하지 않는 경로를 지정하면 오류를 기록합니다.

샘플 내비게이션 제공자는 이 방법을 덮어쓰지 않습니다. 다음은 기본 구현 방식입니다.

NormalizeRelativePath 구현에 대해 기억해야 할 점들

System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* 구현은 매개변수를 파싱해야 path 하지만, 순수하게 구문적 파싱만 사용할 필요는 없습니다. 이 방법을 설계하여 경로 정보를 데이터 저장소에서 조회하고, 케이싱과 표준화된 경로 문법에 맞는 경로를 생성하도록 권장합니다.

코드 샘플

전체 샘플 코드는 AccessDbProviderSample05 코드 샘플을 참조하세요.

객체 유형 및 서식 정의

제공자가 기존 객체에 멤버를 추가하거나 새로운 객체를 정의할 수 있습니다. 자세한 내용은 '객체 유형 및 서식화 확장'을 참조하세요.

Windows PowerShell 제공자 구축

자세한 내용은 ' Cmdlet, Providers, Host Application 등록 방법'을 참조하세요.

Windows PowerShell 제공자 테스트

Windows PowerShell 제공자가 Windows PowerShell에 등록된 후, 명령줄에서 지원되는 cmdlet을 실행하여 파생을 통해 제공된 cmdlet을 테스트할 수 있습니다. 이 예시는 샘플 내비게이션 제공자를 테스트할 것입니다.

  1. 새 셸을 실행하고 cmdlet을 Set-Location 사용해 Access 데이터베이스를 나타내는 경로를 설정하세요.

    Set-Location mydb:
    
  2. 이제 cmdlet을 Get-ChildItem 실행하여 데이터베이스 항목 목록, 즉 사용 가능한 데이터베이스 테이블 목록을 불러옵니다. 각 테이블에 대해 이 cmdlet은 테이블 행 수도 가져옵니다.

    Get-ChildItem | Format-Table RowCount, Name -AutoSize
    
    RowCount   Name
    --------   ----
         180   MSysAccessObjects
           0   MSysACEs
           1   MSysCmdbars
           0   MSysIMEXColumns
           0   MSysIMEXSpecs
           0   MSysObjects
           0   MSysQueries
           7   MSysRelationships
           8   Categories
          91   Customers
           9   Employees
        2155   Order Details
         830   Orders
          77   Products
           3   Shippers
          29   Suppliers
    
  3. 다시 한 번 cmdlet을 사용 Set-Location 해 직원 데이터 테이블의 위치를 설정하세요.

    Set-Location Employees
    
  4. 이제 cmdlet을 Get-Location 사용해 Employees 테이블로 가는 경로를 가져옵니다.

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. 이제 명령어에 파이프를 연결 Format-Table 해 사용 Get-ChildItem 하세요. 이 cmdlet 집합은 직원 데이터 테이블의 항목, 즉 테이블 행을 불러옵니다. 이들은 명령어에 Format-Table 따라 형식화되어 있습니다.

    Get-ChildItem | Format-Table RowNumber, PSIsContainer, Data -AutoSize
    
    RowNumber   PSIsContainer   Data
    ---------   --------------   ----
    0           False            System.Data.DataRow
    1           False            System.Data.DataRow
    2           False            System.Data.DataRow
    3           False            System.Data.DataRow
    4           False            System.Data.DataRow
    5           False            System.Data.DataRow
    6           False            System.Data.DataRow
    7           False            System.Data.DataRow
    8           False            System.Data.DataRow
    
  6. 이제 Employees 데이터 테이블 0행의 항목을 가져오기 위해 cmdlet을 실행할 Get-Item 수 있습니다.

    Get-Item 0
    
    PSPath        : AccessDB::C:\PS\Northwind.mdb\Employees\0
    PSParentPath  : AccessDB::C:\PS\Northwind.mdb\Employees
    PSChildName   : 0
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : False
    Data           : System.Data.DataRow
    RowNumber      : 0
    
  7. 다시 명령어를 사용 Get-Item 해 0행 항목의 직원 데이터를 불러옵니다.

    (Get-Item 0).Data
    
    EmployeeID      : 1
    LastName        : Davis
    FirstName       : Sara
    Title           : Sales Representative
    TitleOfCourtesy : Ms.
    BirthDate       : 12/8/1968 12:00:00 AM
    HireDate        : 5/1/1992 12:00:00 AM
    Address         : 4567 Main Street
                      Apt. 2A
    City            : Buffalo
    Region          : NY
    PostalCode      : 98052
    Country         : USA
    HomePhone       : (206) 555-9857
    Extension       : 5467
    Photo           : EmpID1.bmp
    Notes           : Education includes a BA in psychology from
                      Colorado State University. She also completed "The
                      Art of the Cold Call."  Nancy is a member of
                      Toastmasters International.
    ReportsTo       : 2
    

또한 참조하십시오

Windows PowerShell 제공자 생성

Windows PowerShell 제공자를 설계하세요

객체 유형 및 서식 확장

Implement a Container Windows PowerShell provider

Cmdlet, 제공자 및 호스트 애플리케이션 등록 방법

Windows PowerShell 프로グラ머 가이드

Windows PowerShell SDK