다음을 통해 공유


Windows PowerShell 탐색 공급자 만들기

이 항목에서는 데이터 저장소를 탐색할 수 있는 Windows PowerShell 탐색 공급자를 만드는 방법을 설명합니다. 이 유형의 공급자는 재귀 명령, 중첩된 컨테이너 및 상대 경로를 지원합니다.

비고

Windows Vista 및 .NET Framework 3.0 런타임 구성 요소용 Microsoft Windows 소프트웨어 개발 키트를 사용하여 이 공급자에 대한 C# 소스 파일(AccessDBSampleProvider05.cs)을 다운로드할 수 있습니다. 다운로드 지침은 Windows PowerShell을 설치하고 Windows PowerShell SDK다운로드하는 방법을 참조하세요. 다운로드한 원본 파일은 <PowerShell 샘플> 디렉터리에서 사용할 수 있습니다. 다른 Windows PowerShell 공급자 구현에 대한 자세한 내용은 windows PowerShell 공급자 디자인하는참조하세요.

여기에 설명된 공급자를 사용하면 사용자가 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 특정 기능이 없습니다.

기본 기능 정의

PS 공급자 디자인에 설명된 대로 System.Management.Automation.Provider.NavigationCmdletProvider 기본 클래스는 다른 공급자 기능을 제공하는 여러 다른 클래스에서 파생됩니다. 따라서 Windows PowerShell 탐색 공급자는 해당 클래스에서 제공하는 모든 기능을 정의해야 합니다.

세션별 초기화 정보를 추가하고 공급자가 사용하는 리소스를 해제하는 기능을 구현하려면 기본 PS 공급자만들기를 참조하세요. 그러나 대부분의 공급자(여기에 설명된 공급자 포함)는 Windows PowerShell에서 제공하는 이 기능의 기본 구현을 사용할 수 있습니다.

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

데이터 저장소의 항목(예: 항목 가져오기, 설정 및 지우기)을 조작하려면 공급자가 System.Management.Automation.Provider.ItemCmdletProvider 기본 클래스에서 제공하는 메서드를 구현해야 합니다. 이러한 메서드를 구현하는 방법에 대한 자세한 내용은 Windows PowerShell 항목 공급자만들기를 참조하세요.

데이터 저장소의 자식 항목 또는 해당 이름뿐만 아니라 항목을 만들고, 복사하고, 이름을 바꾸고, 제거하는 메서드로 이동하려면 System.Management.Automation.Provider.ContainerCmdletProvider 기본 클래스에서 제공하는 메서드를 구현해야 합니다. 이러한 메서드를 구현하는 방법에 대한 자세한 내용은 Windows PowerShell 컨테이너 공급자만들기를 참조하세요.

Windows PowerShell 경로 만들기

Windows PowerShell 탐색 공급자는 공급자 내부 Windows PowerShell 경로를 사용하여 데이터 저장소의 항목을 탐색합니다. 공급자 내부 경로를 만들려면 공급자가 Combine-Path cmdlet의 호출을 지원하도록 System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* 메서드를 구현해야 합니다. 이 메서드는 부모 경로와 자식 경로 간의 공급자별 경로 구분 기호를 사용하여 부모 및 자식 경로를 공급자 내부 경로로 결합합니다.

기본 구현은 경로 구분 기호로 "/" 또는 "\"가 있는 경로를 사용하고, 경로 구분 기호를 "\"로 정규화하고, 부모 및 자식 경로 부분을 구분 기호와 결합한 다음, 결합된 경로가 포함된 문자열을 반환합니다.

이 탐색 공급자는 이 메서드를 구현하지 않습니다. 그러나 다음 코드는 System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* 메서드의 기본 구현입니다.

MakePath 구현에 대해 기억해야 할 사항

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

  • System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* 메서드의 구현은 공급자 네임스페이스에서 경로의 유효성을 검사하지 않아야 합니다. 각 매개 변수는 경로의 일부만 나타낼 수 있으며 결합된 파트는 정규화된 경로를 생성하지 않을 수 있습니다. 예를 들어 FileSystem 공급자에 대한 System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* 메서드는 parent 매개 변수에서 "windows\system32"를 수신하고 child 매개 변수에서 "abc.dll"를 받을 수 있습니다. 메서드는 이러한 값을 "\" 구분 기호와 조인하고 정규화된 파일 시스템 경로가 아닌 "windows\system32\abc.dll"를 반환합니다.

    중요합니다

    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를 반환합니다. 사용자가 제공된 경로에 Test-Path cmdlet을 사용할 수 있도록 하려면 이 메서드가 필요합니다.

다음 코드는 샘플 탐색 공급자의 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 cmdlet을 지원하기 위해 탐색 공급자는 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설정되지 않는 한 기존 개체 위로 개체를 이동해서는 안 됩니다. 예를 들어 System.Management.Automation.Provider.CmdletProvider.Force* 속성이 true설정되지 않는 한 FileSystem 공급자는 기존 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 호출하면 true반환됩니다. System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* 메서드는 System.Management.Automation.Provider.CmdletProvider.ShouldContinue 메서드를 호출해야 합니다. 이 메서드는 사용자에게 메시지를 보내 작업을 계속해야 하는지에 대한 피드백을 허용합니다. 공급자는 잠재적으로 위험한 시스템 수정에 대한 추가 검사로 System.Management.Automation.Provider.CmdletProvider.ShouldContinue 호출해야 합니다.

Move-Item Cmdlet에 동적 매개 변수 연결

경우에 따라 Move-Item cmdlet에는 런타임에 동적으로 제공되는 추가 매개 변수가 필요합니다. 이러한 동적 매개 변수를 제공하려면 탐색 공급자는 표시된 경로의 항목에서 필요한 매개 변수 값을 가져오려면 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, 공급자 및 호스트 애플리케이션등록하는 방법을 참조하세요.

Windows PowerShell 공급자 테스트

Windows PowerShell 공급자가 Windows PowerShell에 등록된 경우 파생에서 사용할 수 있는 cmdlet을 포함하여 명령줄에서 지원되는 cmdlet을 실행하여 테스트할 수 있습니다. 이 예제에서는 샘플 탐색 공급자를 테스트합니다.

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

    Set-Location mydb:
    
  2. 이제 Get-ChildItem cmdlet을 실행하여 사용 가능한 데이터베이스 테이블인 데이터베이스 항목 목록을 검색합니다. 각 테이블에 대해 이 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. Set-Location cmdlet을 다시 사용하여 Employees 데이터 테이블의 위치를 설정합니다.

    Set-Location Employees
    
  4. 이제 Get-Location cmdlet을 사용하여 Employees 테이블의 경로를 검색해 보겠습니다.

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. 이제 Format-Table cmdlet에 파이프된 Get-ChildItem cmdlet을 사용합니다. 이 cmdlet 집합은 테이블 행인 Employees 데이터 테이블의 항목을 검색합니다. Format-Table cmdlet에서 지정한 대로 형식이 지정됩니다.

    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. 이제 Get-Item cmdlet을 실행하여 Employees 데이터 테이블의 행 0에 대한 항목을 검색할 수 있습니다.

    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 cmdlet을 다시 사용하여 행 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 공급자 디자인

개체 형식 확장 및 서식

컨테이너 Windows PowerShell 공급자 구현

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

Windows PowerShell 프로그래머 가이드

Windows PowerShell SDK