다음을 통해 공유


Windows PowerShell 아이템 제공자 생성

이 주제는 데이터 저장소 내 데이터를 조작할 수 있는 Windows PowerShell 제공자를 만드는 방법을 설명합니다. 이 주제에서는 저장소 내 데이터 요소들을 데이터 저장소의 "항목"이라고 부릅니다. 따라서 저장소 내 데이터를 조작할 수 있는 제공자를 Windows PowerShell item provider라고 부릅니다.

비고

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

이 주제에서 설명하는 Windows PowerShell 항목 제공자는 Access 데이터베이스에서 데이터 항목을 가져옵니다. 이 경우 "항목"은 Access 데이터베이스의 테이블이거나 테이블 내 행을 의미합니다.

Windows PowerShell item provider 클래스 정의

Windows PowerShell 항목 제공자는 System.Management.Automation.Provider.ItemCmdletProvider 기본 클래스에서 파생된 .NET 클래스를 정의해야 합니다. 다음은 이 절에서 설명한 항목 제공자의 클래스 정의입니다.

[CmdletProvider("AccessDB", ProviderCapabilities.None)]

public class AccessDBProvider : ItemCmdletProvider

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

기본 기능 정의

Windows PowerShell Provider를 설계하는 데 설명된 바와 같이, System.Management.Automation.Provider.DriveCmdletProvider 클래스는 서로 다른 제공 기능을 제공한 여러 클래스에서 파생되었습니다. 따라서 Windows PowerShell 항목 제공자는 해당 클래스들이 제공하는 모든 기능을 정의해야 합니다.

세션별 초기화 정보 추가와 제공자가 사용하는 자원을 해제하는 기능을 구현하는 방법에 대한 자세한 내용은 '기본 Windows PowerShell 제공자 만들기'를 참조하세요. 하지만 여기서 설명한 제공자를 포함해 대부분의 제공자는 Windows PowerShell에서 제공하는 기본 구현을 사용할 수 있습니다.

Windows PowerShell 항목 제공자가 저장소 내 항목을 조작하기 전에, System.Management.Automation.Provider.DriveCmdletProvider 기본 클래스의 메서드를 구현하여 데이터 저장소에 접근해야 합니다. 이 클래스 구현에 대한 자세한 내용은 Windows PowerShell Drive Provider 만들기를 참조하세요.

경로 유효성 검사

데이터 항목을 찾을 때, Windows PowerShell 런타임은 Windows PowerShell Works의 "PSPath 개념" 섹션에 정의된 대로 제공자에게 Windows PowerShell 경로를 제공합니다. Windows PowerShell 항목 제공자는 System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath 메서드를 구현하여 전달된 경로의 구문 및 의미적 유효성을 검증해야 합니다. 이 메서드는 경로가 유효할 때만 반환하고, false 그렇지 않으면 반환 true 됩니다. 이 방법의 구현은 경로에 있는 항목의 존재를 검증하는 것이 아니라, 경로가 문법적·의미론적으로 올바르는지만 확인해야 한다는 점을 유념하세요.

다음은 이 공급자에 대한 System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath 메서드의 구현입니다. 이 구현은 경로 내 모든 구분자를 균일한 구분자로 변환하는 NormalizePath 보조 메서드를 호출한다는 점에 유의하세요.

protected override bool IsValidPath(string path)
{
    bool result = true;

    // check if the path is null or empty
    if (String.IsNullOrEmpty(path))
    {
        result = false;
    }

    // convert all separators in the path to a uniform one
    path = NormalizePath(path);

    // split the path into individual chunks
    string[] pathChunks = path.Split(pathSeparator.ToCharArray());

    foreach (string pathChunk in pathChunks)
    {
        if (pathChunk.Length == 0)
        {
            result = false;
        }
    }
    return result;
} // IsValidPath

아이템의 존재 여부를 판단하기

경로를 검증한 후, Windows PowerShell 런타임은 해당 경로에 데이터 항목이 존재하는지 확인해야 합니다. 이러한 유형의 쿼리를 지원하기 위해 Windows PowerShell 항목 제공자는 System.Management.Automation.Provider.ItemCmdletProvider.ItemExists 메서드를 구현합니다. 이 메서드는 지정된 경로에서 아이템을 찾 true 고, false 그렇지 않으면 (기본값) 반환합니다.

다음은 이 공급자에 대한 System.Management.Automation.Provider.ItemCmdletProvider.ItemExists 메서드의 구현입니다. 이 메서드는 PathIsDrive, ChunkPath, GetTable 보조 메서드를 호출하며, 공급자가 정의한 DatabaseTableInfo 객체를 사용합니다.

protected override bool ItemExists(string path)
{
    // check if the path represented is a drive
    if (PathIsDrive(path))
    {
        return true;
    }

    // Obtain type, table name and row number from path
    string tableName;
    int rowNumber;

    PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

    DatabaseTableInfo table = GetTable(tableName);

    if (type == PathType.Table)
    {
        // if specified path represents a table then DatabaseTableInfo
        // object for the same should exist
        if (table != null)
        {
            return true;
        }
    }
    else if (type == PathType.Row)
    {
        // if specified path represents a row then DatabaseTableInfo should
        // exist for the table and then specified row number must be within
        // the maximum row count in the table
        if (table != null && rowNumber < table.RowCount)
        {
            return true;
        }
    }

    return false;

} // ItemExists

ItemExists 구현 시 기억해야 할 사항

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

동적 매개변수를 Test-Path cmdlet에 부착하기

때때로 Test-PathSystem.Management.Automation.Provider.ItemCmdletProvider.ItemExists 를 호출하는 cmdlet이 런타임에 동적으로 지정되는 추가 매개변수를 요구하기도 합니다. 이러한 동적 매개변수를 제공하기 위해 Windows PowerShell 항목 제공자는 System.Management.Automation.Provider.ItemCmdletProvider.ItemExistsDynamicParameters 메서드를 구현해야 합니다. 이 메서드는 지정된 경로에 있는 항목의 동적 매개변수를 가져오고, cmdlet 클래스나 System.Management.Automation.RuntimeDefinedParameterDictionary 객체와 유사한 파싱 속성을 가진 속성과 필드를 반환합니다. Windows PowerShell 런타임은 반환된 객체를 사용하여 명령어에 Test-Path 매개변수를 추가합니다.

이 Windows PowerShell 항목 제공자는 이 메서드를 구현하지 않습니다. 하지만 다음 코드는 이 방법의 기본 구현입니다.

아이템 검색

항목을 가져오려면, Windows PowerShell 항목 제공자는 명령어 호출을 지원하기 위해 System.Management.Automation.Provider.ItemCmdletProvider.GetItem 메서드를 덮어써야 합니다 Get-Item . 이 메서드는 System.Management.Automation.Provider.CmdletProvider.WriteItemObject 메서드를 사용하여 항목을 작성합니다.

다음은 이 공급자에 대한 System.Management.Automation.Provider.ItemCmdletProvider.GetItem 메서드의 구현입니다. 이 메서드는 GetTableGetRow 헬퍼 메서드를 사용하여 Access 데이터베이스의 테이블이나 데이터 테이블의 행인 항목을 검색합니다.

protected override void GetItem(string path)
{
    // check if the path represented is a drive
    if (PathIsDrive(path))
    {
        WriteItemObject(this.PSDriveInfo, path, true);
        return;
    }// if (PathIsDrive...

     // Get table name and row information from the path and do 
     // necessary actions
     string tableName;
     int rowNumber;

     PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

     if (type == PathType.Table)
     {
         DatabaseTableInfo table = GetTable(tableName);
         WriteItemObject(table, path, true);
     }
     else if (type == PathType.Row)
     {
         DatabaseRowInfo row = GetRow(tableName, rowNumber);
         WriteItemObject(row, path, false);
     }
     else
     {
         ThrowTerminatingInvalidPathException(path);
     }

 } // GetItem

GetItem 구현 시 기억해야 할 점

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

동적 매개변수를 Get-Item cmdlet에 부착하기

때때로 cmdlet은 Get-Item 런타임에 동적으로 지정되는 추가 매개변수를 요구하기도 합니다. 이러한 동적 매개변수를 제공하려면 Windows PowerShell 항목 제공자가 System.Management.Automation.Provider.ItemCmdletProvider.GetItemDynamicParameters 메서드를 구현해야 합니다. 이 메서드는 지정된 경로에 있는 항목의 동적 매개변수를 가져오고, cmdlet 클래스나 System.Management.Automation.RuntimeDefinedParameterDictionary 객체와 유사한 파싱 속성을 가진 속성과 필드를 반환합니다. Windows PowerShell 런타임은 반환된 객체를 사용하여 명령어에 Get-Item 매개변수를 추가합니다.

이 제공자는 이 방법을 구현하지 않습니다. 하지만 다음 코드는 이 방법의 기본 구현입니다.

아이템 설정

항목을 설정하려면, Windows PowerShell 아이템 제공자는 System.Management.Automation.Provider.ItemCmdletProvider.SetItem 메서드를 덮어써서 명령어 호출 Set-Item 을 지원해야 합니다. 이 메서드는 지정된 경로에서 아이템의 값을 설정합니다.

이 프로덕션은 System.Management.Automation.Provider.ItemCmdletProvider.SetItem 메서드에 대한 오버라이드를 제공하지 않습니다. 하지만 다음은 이 방법의 기본 구현입니다.

SetItem 구현에 대해 기억할 점들

다음 조건들이 System.Management.Automation.Provider.ItemCmdletProvider.SetItem 구현에 적용될 수 있습니다:

SetItem의 동적 매개변수 가져오기

때때로 cmdlet은 Set-Item 런타임에 동적으로 지정되는 추가 매개변수를 요구하기도 합니다. 이러한 동적 매개변수를 제공하기 위해 Windows PowerShell 항목 제공자는 System.Management.Automation.Provider.ItemCmdletProvider.SetItemDynamicParameters 메서드를 구현해야 합니다. 이 메서드는 지정된 경로에 있는 항목의 동적 매개변수를 가져오고, cmdlet 클래스나 System.Management.Automation.RuntimeDefinedParameterDictionary 객체와 유사한 파싱 속성을 가진 속성과 필드를 반환합니다. Windows PowerShell 런타임은 반환된 객체를 사용하여 명령어에 Set-Item 매개변수를 추가합니다.

이 제공자는 이 방법을 구현하지 않습니다. 하지만 다음 코드는 이 방법의 기본 구현입니다.

아이템 정리하기

항목을 지우기 위해 Windows PowerShell 항목 제공자는 System.Management.Automation.Provider.ItemCmdletProvider.ClearItem 메서드를 구현하여 명령어 호출 Clear-Item 을 지원합니다. 이 방법은 지정된 경로에서 데이터 항목을 지웁니다.

이 제공자는 이 방법을 구현하지 않습니다. 하지만 다음 코드는 이 방법의 기본 구현입니다.

ClearItem 구현 시 기억해야 할 사항

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

ClearItem의 동적 매개변수 조회

때때로 cmdlet은 Clear-Item 런타임에 동적으로 지정되는 추가 매개변수를 요구하기도 합니다. 이러한 동적 매개변수를 제공하기 위해 Windows PowerShell 항목 제공자는 System.Management.Automation.Provider.ItemCmdletProvider.ClearItemDynamicParameters 메서드를 구현해야 합니다. 이 메서드는 지정된 경로에 있는 항목의 동적 매개변수를 가져오고, cmdlet 클래스나 System.Management.Automation.RuntimeDefinedParameterDictionary 객체와 유사한 파싱 속성을 가진 속성과 필드를 반환합니다. Windows PowerShell 런타임은 반환된 객체를 사용하여 명령어에 Clear-Item 매개변수를 추가합니다.

이 문항 제공자는 이 방법을 구현하지 않습니다. 하지만 다음 코드는 이 방법의 기본 구현입니다.

아이템에 대한 기본 동작 수행

Windows PowerShell 아이템 제공자는 System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction 메서드를 구현하여 cmdlet에서 Invoke-Item 호출을 지원하며, 이를 통해 제공자가 지정된 경로에서 아이템에 대해 기본 동작을 수행할 수 있습니다. 예를 들어, FileSystem 제공자는 특정 항목에 대해 ShellExecute 를 호출하기 위해 이 메서드를 사용할 수 있습니다.

이 제공자는 이 방법을 구현하지 않습니다. 하지만 다음 코드는 이 방법의 기본 구현입니다.

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

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

InvokeDefaultAction의 동적 매개변수를 가져오기

때때로 cmdlet은 Invoke-Item 런타임에 동적으로 지정되는 추가 매개변수를 요구하기도 합니다. 이러한 동적 매개변수를 제공하려면 Windows PowerShell 항목 제공자가 System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultActionDynamicParameters 메서드를 구현해야 합니다. 이 메서드는 지정된 경로에 있는 항목의 동적 매개변수를 가져오고, cmdlet 클래스나 System.Management.Automation.RuntimeDefinedParameterDictionary 객체와 유사한 파싱 속성을 가진 속성과 필드를 반환합니다. Windows PowerShell 런타임은 반환된 객체를 사용하여 동적 매개변수를 cmdlet에 Invoke-Item 추가합니다.

이 문항 제공자는 이 방법을 구현하지 않습니다. 하지만 다음 코드는 이 방법의 기본 구현입니다.

헬퍼 메서드 및 클래스 구현

이 항목 제공자는 Windows PowerShell에서 정의한 공개 오버라이드 메서드에서 사용하는 여러 헬퍼 메서드와 클래스를 구현합니다. 이 헬퍼 메서드와 클래스의 코드는 코드 샘플 섹션에 나와 있습니다.

정규화 경로 방법

이 항목 제공자는 경로가 일관된 형식을 갖도록 NormalizePath 보조 메서드를 구현합니다. 지정된 형식은 백슬래시(\)를 구분자로 사용합니다.

PathIsDrive 방법

이 항목 제공자는 지정된 경로가 실제로 드라이브 이름인지 판단하는 PathIsDrive 보조 메서드를 구현합니다.

청크패스 방법

이 항목 제공자는 지정된 경로를 분할하여 제공자가 개별 요소를 식별할 수 있도록 하는 ChunkPath 보조 메서드를 구현합니다. 경로 요소들로 구성된 배열을 반환합니다.

GetTable 메서드

이 항목 제공자는 호출에서 지정한 테이블에 대한 정보를 나타내는 DatabaseTableInfo 객체를 반환하는 GetTables 헬퍼 메서드를 구현합니다.

GetRow 메서드

System.Management.Automation.Provider.ItemCmdletProvider.GetItem 메서드는 GetRows 헬퍼 메서드를 호출합니다. 이 헬퍼 메서드는 테이블에서 지정된 행에 대한 정보를 나타내는 DatabaseRowInfo 객체를 가져옵니다.

DatabaseTableInfo 클래스

이 항목 제공자는 데이터베이스 내 데이터 테이블 내 정보 집합을 나타내는 DatabaseTableInfo 클래스를 정의합니다. 이 클래스는 System.IO.Directoryinfo 클래스와 유사합니다.

샘플 항목 제공자는 데이터베이스 내 테이블을 정의하는 테이블 정보 객체들의 집합을 반환하는 DatabaseTableInfo.GetTables 메서드를 정의합니다. 이 방법에는 데이터베이스 오류가 0개의 행으로 표시되도록 try/catch 블록이 포함되어 있습니다.

DatabaseRowInfo 클래스

이 항목 제공자는 데이터베이스 테이블의 행을 나타내는 DatabaseRowInfo 헬퍼 클래스를 정의합니다. 이 클래스는 System.IO.FileInfo 클래스와 유사합니다.

샘플 제공자는 지정된 테이블에 대한 행 정보 객체 집합을 반환하는 DatabaseRowInfo.GetRows 메서드를 정의합니다. 이 방법에는 예외를 포획하는 try/catch 블록이 포함되어 있습니다. 오류가 있으면 행 정보가 없게 됩니다.

코드 샘플

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

객체 유형 및 서식 정의

제공자를 작성할 때 기존 객체에 멤버를 추가하거나 새로운 객체를 정의해야 할 수도 있습니다. 완성 후에는 Windows PowerShell이 객체의 구성원을 식별할 수 있는 Types 파일과 객체 표시 방식을 정의하는 Format 파일을 만듭니다. 자세한 내용은 ' 객체 유형 및 서식화 확장'을 참조하세요.

Windows PowerShell 제공자 구축

Cmdlet, Providers, Hosting 애플리케이션 등록 방법을 참조하세요.

Windows PowerShell 제공자 테스트

이 Windows PowerShell 항목 제공자가 Windows PowerShell에 등록되면, 기본 기능과 드라이브 기능만 테스트할 수 있습니다. 항목 조작을 테스트하려면 ' Implementing a Container Windows PowerShell Provider'에 설명된 컨테이너 기능도 구현해야 합니다.

참고하십시오