이 주제는 다중 계층 데이터 저장소에서 작동할 수 있는 Windows PowerShell 제공자를 만드는 방법을 설명합니다. 이 유형의 데이터 저장소에서는 저장소의 최상위 레벨에 루트 항목이 있고, 각 후속 레벨은 자식 항목 노드로 불립니다. 사용자가 이 자식 노드에서 작업할 수 있게 함으로써, 사용자는 데이터 저장소를 통해 계층적으로 상호작용할 수 있습니다.
다단계 데이터 저장소에서 동작할 수 있는 제공자를 Windows PowerShell 컨테이너 제공자라고 부릅니다. 하지만 Windows PowerShell 컨테이너 제공자는 아이템이 포함된 컨테이너가 하나뿐(중첩된 컨테이너가 아님)만 사용할 수 있다는 점을 유념하세요. 중첩된 컨테이너가 있다면 Windows PowerShell 내비게이션 제공자를 구현해야 합니다. Windows PowerShell 내비게이션 제공자 구현에 대한 자세한 내용은 ' Windows PowerShell 내비게이션 제공자 만들기'를 참조하세요.
비고
Microsoft Windows Vista 소프트웨어 개발 키트와 .NET Framework 3.0 런타임 컴포넌트를 사용하여 이 제공자의 C# 소스 파일(AccessDBSampleProvider04.cs)을 다운로드할 수 있습니다. 다운로드 방법은 Windows PowerShell 설치 방법과 Windows PowerShell SDK를 다운로드하세요. 다운로드한 소스 파일은 PowerShell Samples> 디렉터리에서< 이용할 수 있습니다. 다른 Windows PowerShell 제공자 구현에 대한 자세한 내용은 'Windows PowerShell Provider를 설계하기'를 참조하세요.
여기서 설명한 Windows PowerShell 컨테이너 제공자는 데이터베이스를 단일 컨테이너로 정의하며, 데이터베이스의 테이블과 행은 컨테이너의 항목으로 정의됩니다.
주의
이 설계는 데이터베이스가 이름 ID를 가진 필드를 가지고 있고, 필드 타입이 LongInteger임을 가정한다는 점을 유의하세요.
Windows PowerShell Container Provider class 정의
Windows PowerShell 컨테이너 제공자는 System.Management.Automation.Provider.ContainerCmdletProvider 기본 클래스에서 파생된 .NET 클래스를 정의해야 합니다. 다음은 이 섹션에서 설명한 Windows PowerShell 컨테이너 제공자의 클래스 정의입니다.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ContainerCmdletProvider
이 클래스 정의에서 System.Management.Automation.Provider.CmdletProviderAttribute 속성에 두 가지 매개변수가 포함되어 있음을 주목하세요. 첫 번째 매개변수는 Windows PowerShell에서 사용하는 제공자의 사용자 친화적인 이름을 지정합니다. 두 번째 매개변수는 명령 처리 중에 제공자가 Windows PowerShell 런타임에 노출하는 Windows PowerShell 고유 기능을 지정합니다. 이 제공자에는 Windows PowerShell 특유의 기능이 추가되지 않습니다.
기본 기능 정의
Windows PowerShell Provider를 설계하는 데 설명된 대로, System.Management.Automation.Provider.ContainerCmdletProvider 클래스는 서로 다른 제공 기능을 제공한 여러 클래스에서 파생되었습니다. 따라서 Windows PowerShell 컨테이너 제공자는 해당 클래스들이 제공하는 모든 기능을 정의해야 합니다.
세션별 초기화 정보를 추가하거나 제공자가 사용하는 리소스를 해제하는 기능을 구현하려면 '기본 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)을 참조하세요.
아동 아이템 회수
자식 항목을 가져오려면, Windows PowerShell 컨테이너 제공자는 명령어 호출을 지원 Get-ChildItem 하기 위해 System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* 메서드를 덮어써야 합니다. 이 메서드는 데이터 저장소에서 자식 항목을 가져와 파이프라인에 객체로 기록합니다. cmdlet의 매개변수가 지정되어 있으면 recurse , 메서드는 레벨에 관계없이 모든 자식을 가져옵니다. 매개변수가 recurse 지정되지 않으면, 메서드는 자식 계층의 단일 수준만 검색합니다.
다음은 이 공급자에 대한 System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* 메서드의 구현입니다. 이 메서드는 경로가 Access 데이터베이스를 가리킬 때 모든 데이터베이스 테이블의 자식 항목을 가져오고, 경로가 데이터 테이블을 가리키면 그 테이블의 행에서 자식 항목을 가져옵니다.
protected override void GetChildItems(string path, bool recurse)
{
// If path represented is a drive then the children in the path are
// tables. Hence all tables in the drive represented will have to be
// returned
if (PathIsDrive(path))
{
foreach (DatabaseTableInfo table in GetTables())
{
WriteItemObject(table, path, true);
// if the specified item exists and recurse has been set then
// all child items within it have to be obtained as well
if (ItemExists(path) && recurse)
{
GetChildItems(path + pathSeparator + table.Name, recurse);
}
} // foreach (DatabaseTableInfo...
} // if (PathIsDrive...
else
{
// Get the table name, row number and type of path from the
// path specified
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
// Obtain all the rows within the table
foreach (DatabaseRowInfo row in GetRows(tableName))
{
WriteItemObject(row, path + pathSeparator + row.RowNumber,
false);
} // foreach (DatabaseRowInfo...
}
else if (type == PathType.Row)
{
// In this case the user has directly specified a row, hence
// just give that particular row
DatabaseRowInfo row = GetRow(tableName, rowNumber);
WriteItemObject(row, path + pathSeparator + row.RowNumber,
false);
}
else
{
// In this case, the path specified is not valid
ThrowTerminatingInvalidPathException(path);
}
} // else
} // GetChildItems
GetChildItems 구현 시 기억해야 할 사항
System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* 구현에 다음과 같은 조건이 적용될 수 있습니다:
제공자 클래스를 정의할 때, Windows PowerShell 컨테이너 제공자는 System.Management.Automation.Provider.ProviderCapabilities 열거에서 ExpandWildcards, Filter, Include, Exclusion 등의 제공 능력을 선언할 수 있습니다. 이 경우 System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* 메서드의 구현은 해당 메서드에 전달되는 경로가 지정된 능력의 요구사항을 충족하는지 확인해야 합니다. 이를 위해 메서드는 적절한 속성, 예를 들어 System.Management.Automation.Provider.CmdletProvider.Exclude* 및 System.Management.Automation.Provider.CmdletProvider.Include* 속성에 접근해야 합니다.
이 방법의 구현은 사용자가 아이템을 볼 수 있도록 할 수 있는 접근 방식을 고려해야 합니다. 예를 들어, 사용자가 Windows PowerShell에서 제공하는 FileSystem 제공자를 통해 파일에 쓰기 권한을 가지지만 읽기 권한이 없다면, 파일은 여전히 존재하며 System.Management.Automation.Provider.ItemCmdletProvider.ItemExists* 가 반환
true합니다. 구현 시 자식이 열거 가능한지 확인하기 위해 부모 항목을 확인해야 할 수도 있습니다.여러 항목을 작성할 때는 System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* 메서드를 사용하면 시간이 걸릴 수 있습니다. System.Management.Automation.Provider.CmdletProvider.WriteItemObject* 메서드를 사용해 아이템을 하나씩 작성하도록 프로바이더를 설계할 수 있습니다. 이 기법을 사용하면 해당 아이템을 스트림으로 사용자에게 보여줄 수 있습니다.
System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* 구현은 순환 링크 등이 있을 때 무한 재귀를 방지하는 역할을 합니다. 이러한 조건을 반영하기 위해 적절한 종료 예외가 투입되어야 합니다.
동적 매개변수를 Get-ChildItem 커들렛에 부착하기
때때로 System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems*를 호출하는 명령어가 Get-ChildItem 런타임에 동적으로 지정되는 추가 매개변수를 요구하기도 합니다. 이러한 동적 매개변수를 제공하기 위해 Windows PowerShell 컨테이너 제공자는 System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItemsDynamicParameters* 메서드를 구현해야 합니다. 이 메서드는 지정된 경로에 있는 항목에 대한 동적 매개변수를 가져오고, cmdlet 클래스나 System.Management.Automation.RuntimeDefinedParameterDictionary 객체와 유사한 파싱 속성을 가진 속성과 필드를 반환합니다. Windows PowerShell 런타임은 반환된 객체를 사용하여 명령어에 Get-ChildItem 매개변수를 추가합니다.
이 Windows PowerShell 컨테이너 제공자는 이 메서드를 구현하지 않습니다. 하지만 다음 코드는 이 방법의 기본 구현입니다.
자녀 항목 이름 조회
자식 항목의 이름을 가져오려면, Windows PowerShell 컨테이너 제공자는 System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* 메서드를 덮어써야 하며, 이 메서드가 명령어의 매개변수가 지정될 때 Name 호출 Get-ChildItem 을 지원해야 합니다. 이 메서드는 명령어의 매개변수가 지정되어 있을 경우 returnAllContainers 지정된 경로의 자식 항목 이름이나 모든 컨테이너의 자식 항목 이름을 가져옵니다. 자식 이름은 경로의 잎 부분입니다. 예를 들어, 경로 C:\windows\system32\abc.dll의 자식 이름은 "abc.dll"입니다. 디렉터리 C:\windows\system32의 자식 이름은 "system32"입니다.
다음은 이 공급자에 대한 System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* 메서드의 구현입니다. 지정된 경로가 Access 데이터베이스(드라이브)를 의미하면 이 메서드가 테이블 이름을 가져오고, 경로가 테이블을 나타내면 행 번호를 검색한다는 점에 주목하세요.
protected override void GetChildNames(string path,
ReturnContainers returnContainers)
{
// If the path represented is a drive, then the child items are
// tables. get the names of all the tables in the drive.
if (PathIsDrive(path))
{
foreach (DatabaseTableInfo table in GetTables())
{
WriteItemObject(table.Name, path, true);
} // foreach (DatabaseTableInfo...
} // if (PathIsDrive...
else
{
// Get type, table name and row number from path specified
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
// Get all the rows in the table and then write out the
// row numbers.
foreach (DatabaseRowInfo row in GetRows(tableName))
{
WriteItemObject(row.RowNumber, path, false);
} // foreach (DatabaseRowInfo...
}
else if (type == PathType.Row)
{
// In this case the user has directly specified a row, hence
// just give that particular row
DatabaseRowInfo row = GetRow(tableName, rowNumber);
WriteItemObject(row.RowNumber, path, false);
}
else
{
ThrowTerminatingInvalidPathException(path);
}
} // else
} // GetChildNames
GetChildNames 구현 시 기억해야 할 사항
System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* 구현에 다음과 같은 조건이 적용될 수 있습니다:
제공자 클래스를 정의할 때, Windows PowerShell 컨테이너 제공자는 System.Management.Automation.Provider.ProviderCapabilities 열거에서 ExpandWildcards, Filter, Include, Exclusion 등의 제공 능력을 선언할 수 있습니다. 이 경우 System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* 메서드의 구현은 해당 메서드에 전달되는 경로가 지정된 능력의 요구사항을 충족하는지 확인해야 합니다. 이를 위해 메서드는 적절한 속성, 예를 들어 System.Management.Automation.Provider.CmdletProvider.Exclude* 및 System.Management.Automation.Provider.CmdletProvider.Include* 속성에 접근해야 합니다.
비고
이 규칙의 예외는 cmdlet의 매개변수가 지정될 때
returnAllContainers발생합니다. 이 경우, System.Management.Automation.Provider.CmdletProvider.Filter*, System.Management.Automation.Provider.CmdletProvider.Include*, 또는 System.Management.Automation.Provider.CmdletProvider.Exclude* 속성의 값과 일치하지 않더라도 컨테이너의 자식 이름은 모두 불러와야 합니다.기본적으로 이 메서드의 오버라이드는 System.Management.Automation.Provider.CmdletProvider.Force* 속성이 지정되지 않는 한 일반적으로 사용자에게 숨겨진 객체 이름을 불러와야 합니다. 지정된 경로가 컨테이너를 나타내면 System.Management.Automation.Provider.CmdletProvider.Force* 속성이 필요하지 않습니다.
System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* 구현은 순환 링크 등이 있을 때 무한 재귀를 방지하는 역할을 합니다. 이러한 조건을 반영하기 위해 적절한 종료 예외가 투입되어야 합니다.
동적 매개변수를 Get-ChildItem 커들렛에 부착하기 (이름)
때때로 cmdlet(파라미터 포함Name)은 Get-ChildItem 런타임에 동적으로 지정되는 추가 매개변수를 요구하기도 합니다. 이러한 동적 매개변수를 제공하기 위해 Windows PowerShell 컨테이너 프로바이저는 System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNamesDynamicParameters* 메서드를 구현해야 합니다. 이 메서드는 지정된 경로에 있는 항목의 동적 매개변수를 가져오고, cmdlet 클래스나 System.Management.Automation.RuntimeDefinedParameterDictionary 객체와 유사한 파싱 속성을 가진 속성과 필드를 반환합니다. Windows PowerShell 런타임은 반환된 객체를 사용하여 명령어에 Get-ChildItem 매개변수를 추가합니다.
이 제공자는 이 방법을 구현하지 않습니다. 하지만 다음 코드는 이 방법의 기본 구현입니다.
항목 이름 변경
항목을 이름을 바꾸려면, Windows PowerShell 컨테이너 제공자가 System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* 메서드를 덮어써서 cmdlet의 Rename-Item 호출을 지원해야 합니다. 이 메서드는 지정된 경로에 있는 항목의 이름을 제공된 이름으로 변경합니다. 새 이름은 항상 부모 항목(컨테이너)에 상대적이어야 합니다.
이 제공자는 System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* 메서드를 덮어쓰지 않습니다. 하지만 다음은 기본 구현입니다.
RenameItem 구현에 대해 기억해야 할 점
다음 조건들이 System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* 구현에 적용될 수 있습니다:
제공자 클래스를 정의할 때, Windows PowerShell 컨테이너 제공자는 System.Management.Automation.Provider.ProviderCapabilities 열거에서 ExpandWildcards, Filter, Include, Exclusion 등의 제공 능력을 선언할 수 있습니다. 이 경우 System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* 메서드의 구현은 해당 메서드에 전달되는 경로가 지정된 능력의 요구사항을 충족하는지 확인해야 합니다. 이를 위해 메서드는 적절한 속성, 예를 들어 System.Management.Automation.Provider.CmdletProvider.Exclude* 및 System.Management.Automation.Provider.CmdletProvider.Include* 속성에 접근해야 합니다.
System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* 메서드는 아이템 이름 변경에만 사용되며, 이동 작업에는 적용되지 않습니다. 메서드 구현은 매개변수에
newName경로 구분자를 포함하거나 항목이 부모 위치를 변경할 수 있다면 오류를 기록해야 합니다.기본적으로 System.Management.Automation.Provider.CmdletProvider.Force* 속성이 지정되지 않는 한 이 메서드의 오버라이드는 객체 이름을 변경하지 않아야 합니다. 지정된 경로가 컨테이너를 나타내면 System.Management.Automation.Provider.CmdletProvider.Force* 속성이 필요하지 않습니다.
System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* 메서드의 구현은 데이터 저장소에 변경을 하기 전에 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.ContainerCmdletProvider.RenameItem* 메서드는 System.Management.Automation.Provider.CmdletProvider.RequirementProcedure.ShouldContinue 메서드를 호출해야 합니다. 이 방법은 사용자에게 확인 메시지를 보내 추가 피드백을 받아 작업을 계속해야 하는지 알려줍니다. 공급자는 잠재적으로 위험한 시스템 수정 여부를 추가로 점검하기 위해 System.Management.Automation.Provider.CommandletProvider.ShouldContinue 에 전화해야 합니다.
동적 매개변수를 Rename-Item 커들렛에 부착하기
때때로 cmdlet은 Rename-Item 런타임에 동적으로 지정되는 추가 매개변수를 요구하기도 합니다. 이러한 동적 매개변수를 제공하기 위해 Windows PowerShell 컨테이너 프로바이저는 System.Management.Automation.Provider.ContainerCmdletProvider.RenameItemDynamicParameters* 메서드를 구현해야 합니다. 이 메서드는 지정된 경로에 있는 항목의 매개변수를 가져오고, cmdlet 클래스나 System.Management.Automation.RuntimeDefinedParameterDictionary 객체와 유사한 파싱 속성을 가진 속성과 필드를 반환합니다. Windows PowerShell 런타임은 반환된 객체를 사용하여 명령어에 Rename-Item 매개변수를 추가합니다.
이 컨테이너 제공자는 이 메서드를 구현하지 않습니다. 하지만 다음 코드는 이 방법의 기본 구현입니다.
새로운 아이템 만들기
새로운 항목을 생성하려면, 컨테이너 제공자는 명령어 호출 New-Item 을 지원하기 위해 System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* 메서드를 구현해야 합니다. 이 방법은 지정된 경로에 위치한 데이터 항목을 생성합니다. cmdlet의 매개변수는 type 새 항목에 대한 제공자 정의 타입을 포함합니다. 예를 들어, FileSystem 제공자는 "file" 또는 "directory" 값을 가진 매개변수를 사용합니다 type . cmdlet의 매개변수는 newItemValue 새 항목에 대한 제공자 특화 값을 지정합니다.
다음은 이 공급자에 대한 System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* 메서드의 구현입니다.
protected override void NewItem( string path, string type, object newItemValue )
{
// Create the new item here after
// performing necessary validations
//
// WriteItemObject(newItemValue, path, false);
// Example
//
// if (ShouldProcess(path, "new item"))
// {
// // Create a new item and then call WriteObject
// WriteObject(newItemValue, path, false);
// }
} // NewItem
{
case 1:
{
string name = pathChunks[0];
if (TableNameIsValid(name))
{
tableName = name;
retVal = PathType.Table;
}
}
break;
case 2:
{
string name = pathChunks[0];
NewItem 도입 시 기억해야 할 사항
System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* 구현에 다음과 같은 조건이 적용될 수 있습니다:
System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* 메서드는 매개변수에 전달된 문자열을 대문자 구분에 따라 비교해야 합니다
type. 또한 가장 모호하지 않은 매칭을 가능하게 할 것입니다. 예를 들어, "file"과 "directory" 유형의 경우, 동음이의를 구하기 위해 첫 글자만 필요합니다. 매개변수가type제공자가 생성할 수 없는 타입을 나타내면, System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* 메서드는 제공자가 생성할 수 있는 타입을 나타내는 메시지를 담은 ArgumentException을 작성해야 합니다.매개변수에 대해
newItemValue서는, 최소한 문자열을 받아들이기 위해 System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* 메서드의 구현을 권장합니다. 또한 System.Management.Automation.Provider.ItemCmdletProvider.GetItem* 메서드가 같은 경로에 대해 가져오는 객체 유형을 받아들여야 합니다. System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* 메서드는 System.Management.Automation.LanguagePrimitives.ConvertTo* 메서드를 사용하여 타입을 원하는 타입으로 변환할 수 있습니다.System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* 메서드의 구현은 System.Management.Automation.Provider.CmdletProvider.ShouldProcess를 호출하여 데이터 저장소에 변경을 하기 전에 반환값을 확인해야 합니다. System.Management.Automation.Provider.CmdletProvider.ShouldProcess 호출이 true로 반환된 후, System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* 메서드는 잠재적으로 위험한 시스템 수정 여부를 추가 검사하기 위해 System.Management.Automation.Provider.CmdletProvider.ShouldContinue 메서드를 호출해야 합니다.
동적 매개변수를 New-Item 커들렛에 부착하기
때때로 cmdlet은 New-Item 런타임에 동적으로 지정되는 추가 매개변수를 요구하기도 합니다. 이러한 동적 매개변수를 제공하기 위해 컨테이너 제공자는 System.Management.Automation.Provider.ContainerCmdletProvider.NewItemDynamicParameters* 메서드를 구현해야 합니다. 이 메서드는 지정된 경로에 있는 항목의 매개변수를 가져오고, cmdlet 클래스나 System.Management.Automation.RuntimeDefinedParameterDictionary 객체와 유사한 파싱 속성을 가진 속성과 필드를 반환합니다. Windows PowerShell 런타임은 반환된 객체를 사용하여 명령어에 New-Item 매개변수를 추가합니다.
이 제공자는 이 방법을 구현하지 않습니다. 하지만 다음 코드는 이 방법의 기본 구현입니다.
항목 제거
항목을 제거하려면, Windows PowerShell 제공자는 System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* 메서드를 덮어써 명령어 호출 Remove-Item 을 지원해야 합니다. 이 방법은 지정된 경로에서 데이터 저장소에서 항목을 삭제합니다. cmdlet의 Remove-Item 매개변수가 로 설정true되어 있으면recurse, 이 메서드는 레벨에 관계없이 모든 자식 항목을 제거합니다. 매개변수가 로 설정 false되어 있으면 메서드는 지정된 경로에서 단 하나의 항목만 제거합니다.
이 제공업체는 아이템 제거를 지원하지 않습니다. 하지만 다음 코드는 System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem*의 기본 구현입니다.
RemoveItem 구현 시 기억할 점들
System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* 구현에 다음과 같은 조건이 적용될 수 있습니다:
제공자 클래스를 정의할 때, Windows PowerShell 컨테이너 제공자는 System.Management.Automation.Provider.ProviderCapabilities 열거에서 ExpandWildcards, Filter, Include, Exclusion 등의 제공 능력을 선언할 수 있습니다. 이 경우 System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* 메서드의 구현은 해당 메서드에 전달되는 경로가 지정된 능력의 요구사항을 충족하는지 확인해야 합니다. 이를 위해 메서드는 적절한 속성, 예를 들어 System.Management.Automation.Provider.CmdletProvider.Exclude* 및 System.Management.Automation.Provider.CmdletProvider.Include* 속성에 접근해야 합니다.
기본적으로 System.Management.Automation.Provider.CmdletProvider.Force* 속성이 true로 설정되어 있지 않으면 이 메서드의 오버라이드는 객체를 제거하지 않아야 합니다. 지정된 경로가 컨테이너를 나타내면 System.Management.Automation.Provider.CmdletProvider.Force* 속성이 필요하지 않습니다.
System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* 구현은 순환 링크 등이 있을 때 무한 재귀를 방지하는 역할을 합니다. 이러한 조건을 반영하기 위해 적절한 종료 예외가 투입되어야 합니다.
System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* 메서드 구현은 데이터 저장소에 변경을 하기 전에 System.Management.Automation.Provider.CmdletProvider.ShouldProcess를 호출하여 반환값을 확인해야 합니다. System.Management.Automation.Provider.CmdletProvider.ShouldProcess 호출 후
trueSystem.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* 메서드는 잠재적으로 위험한 시스템 수정 여부를 추가 검사하기 위해 System.Management.Automation.Provider.CmdletProvider.ShouldContinue 메서드를 호출해야 합니다.
동적 매개변수를 Remove-Item 커들렛에 부착하기
때때로 cmdlet은 Remove-Item 런타임에 동적으로 지정되는 추가 매개변수를 요구하기도 합니다. 이러한 동적 매개변수를 제공하기 위해 컨테이너 제공자는 이 매개변수를 처리하기 위해 System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters* 메서드를 구현해야 합니다. 이 메서드는 지정된 경로에 있는 항목의 동적 매개변수를 가져오고, cmdlet 클래스나 System.Management.Automation.RuntimeDefinedParameterDictionary 객체와 유사한 파싱 속성을 가진 속성과 필드를 반환합니다. Windows PowerShell 런타임은 반환된 객체를 사용하여 명령어에 Remove-Item 매개변수를 추가합니다.
이 컨테이너 제공자는 이 메서드를 구현하지 않습니다. 하지만 다음 코드는 System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters*의 기본 구현입니다.
자식 항목에 대한 쿼리
지정된 경로에 자식 항목이 존재하는지 확인하기 위해 Windows PowerShell 컨테이너 제공자는 System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* 메서드를 덮어써야 합니다. 이 메서드는 항목에 자식이 있으면 반환하고, false 그렇지 않으면 반환 true 합니다. null 또는 빈 경로에 대해, 메서드는 데이터 저장소 내 모든 항목을 자식으로 간주하고 를 반환합니다 true.
다음은 System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* 메서드의 오버라이드입니다. ChunkPath 헬퍼 메서드가 생성한 경로 부분이 두 개 이상이라면, 데이터베이스 컨테이너와 테이블 컨테이너만 정의되어 있으므로 메서드는 를 반환 false합니다. 이 헬퍼 방법에 대한 자세한 내용은 ChunkPath 메서드를 참고하시기 바랍니다. 자세한 내용은 'Windows PowerShell Item Provider' 작성 과정에 나와 있습니다.
protected override bool HasChildItems( string path )
{
return false;
} // HasChildItems
ErrorCategory.InvalidOperation, tableName));
}
return results;
HasChildItems 구현 시 기억해야 할 사항
System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* 구현에 다음과 같은 조건이 적용될 수 있습니다:
- 컨테이너 제공자가 흥미로운 마운트 포인트를 포함하는 루트를 노출한다면, System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* 메서드의 구현은 경로에 null이나 빈 문자열이 전달되면 반환
true되어야 합니다.
항목 복사
항목을 복사하려면, 컨테이너 제공자는 명령어 호출 Copy-Item 을 지원하기 위해 System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem 메서드를 구현해야 합니다. 이 방법은 cmdlet 매개변수가 path 지시한 위치에서 해당 매개변수가 copyPath 지시한 위치로 데이터 항목을 복사합니다. 매개변수가 recurse 지정되면 메서드는 모든 하위 컨테이너를 복사합니다. 매개변수가 지정되지 않으면, 메서드는 단일 레벨의 항목만 복사합니다.
이 제공자는 이 방법을 구현하지 않습니다. 하지만 다음 코드는 System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem의 기본 구현입니다.
CopyItem 구현에 대해 기억해야 할 점
System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem 구현에 다음과 같은 조건이 적용될 수 있습니다:
제공자 클래스를 정의할 때, Windows PowerShell 컨테이너 제공자는 System.Management.Automation.Provider.ProviderCapabilities 열거에서 ExpandWildcards, Filter, Include, Exclusion 등의 제공 능력을 선언할 수 있습니다. 이 경우 System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* 메서드의 구현은 해당 메서드에 전달되는 경로가 지정된 능력의 요구사항을 충족하는지 확인해야 합니다. 이를 위해 메서드는 적절한 속성, 예를 들어 System.Management.Automation.Provider.CmdletProvider.Exclude* 및 System.Management.Automation.Provider.CmdletProvider.Include* 속성에 접근해야 합니다.
기본적으로 이 메서드의 오버라이드는 System.Management.Automation.Provider.CmdletProvider.Force* 속성이 로 설정
true되지 않는 한 기존 객체 위에 객체를 복사하지 않아야 합니다. 예를 들어, FileSystem 제공자는 System.Management.Automation.Provider.CmdletProvider.Force* 속성을 로 설정true하지 않는 한 기존 C:\abc.txt 파일 위에 C:\temp\abc.txt을 복사하지 않습니다. 매개변수에copyPath지정된 경로가 존재하고 컨테이너를 나타내는 경우, System.Management.Automation.Provider.CmdletProvider.Force* 속성은 필요하지 않습니다. 이 경우 System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem 은 매개변수가path나타내는 항목을 자식으로 나타내copyPath는 컨테이너로 복사해야 합니다.System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem 구현은 순환 링크 등이 있을 때 무한 재귀를 방지하는 역할을 합니다. 이러한 조건을 반영하기 위해 적절한 종료 예외가 투입되어야 합니다.
System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem 메서드의 구현은 데이터 저장소에 변경을 하기 전에 System.Management.Automation.Provider.CmdletProvider.ShouldProcess를 호출하여 반환값을 확인해야 합니다. System.Management.Automation.Provider.CmdletProvider.ShouldProcess 호출이 true로 반환된 후, System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem 메서드는 잠재적으로 위험한 시스템 수정 여부를 추가 검사하기 위해 System.Management.Automation.Provider.CmdletProvider.ShouldContinue 메서드를 호출해야 합니다. 이 메서드들을 호출하는 방법에 대한 자세한 내용은 항목 이름 변경(Rename Items)을 참조하세요.
동적 매개변수를 Copy-Item 커들렛에 부착하기
때때로 cmdlet은 Copy-Item 런타임에 동적으로 지정되는 추가 매개변수를 요구하기도 합니다. 이러한 동적 매개변수를 제공하기 위해 Windows PowerShell 컨테이너 제공자는 이 매개변수를 처리하는 System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters* 메서드를 구현해야 합니다. 이 메서드는 지정된 경로에 있는 항목의 매개변수를 가져오고, cmdlet 클래스나 System.Management.Automation.RuntimeDefinedParameterDictionary 객체와 유사한 파싱 속성을 가진 속성과 필드를 반환합니다. Windows PowerShell 런타임은 반환된 객체를 사용하여 명령어에 Copy-Item 매개변수를 추가합니다.
이 제공자는 이 방법을 구현하지 않습니다. 하지만 다음 코드는 System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters*의 기본 구현입니다.
코드 샘플
전체 샘플 코드는 AccessDbProviderSample04 코드 샘플을 참조하세요.
Windows PowerShell 제공자 구축
Cmdlet, Providers, Hosting 애플리케이션 등록 방법을 참조하세요.
Windows PowerShell 제공자 테스트
Windows PowerShell 제공자가 Windows PowerShell에 등록된 후, 명령줄에서 지원되는 cmdlet을 실행해 테스트할 수 있습니다. 다음 예제 출력은 가상의 Access 데이터베이스를 사용한다는 점을 유의하세요.
명령어를
Get-ChildItem실행하여 Access 데이터베이스의 Customers 테이블에서 자식 항목 목록을 불러옵니다.Get-ChildItem mydb:customers다음 출력물이 나타난다.
PSPath : AccessDB::customers PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : True Data : System.Data.DataRow Name : Customers RowCount : 91 Columns :다시 cmdlet을
Get-ChildItem실행하여 테이블의 데이터를 가져오세요.(Get-ChildItem mydb:customers).Data다음 출력물이 나타난다.
TABLE_CAT : C:\PS\northwind TABLE_SCHEM : TABLE_NAME : Customers TABLE_TYPE : TABLE REMARKS :이제 cmdlet을
Get-Item사용해 데이터 테이블의 0행에 있는 항목을 가져오세요.Get-Item mydb:\customers\0다음 출력물이 나타난다.
PSPath : AccessDB::customers\0 PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : False Data : System.Data.DataRow RowNumber : 00행 항목의 데이터를 가져오기 위해 재사용
Get-Item하세요.(Get-Item mydb:\customers\0).Data다음 출력물이 나타난다.
CustomerID : 1234 CompanyName : Fabrikam ContactName : Eric Gruber ContactTitle : President Address : 4567 Main Street City : Buffalo Region : NY PostalCode : 98052 Country : USA Phone : (425) 555-0100 Fax : (425) 555-0101이제 cmdlet을
New-Item사용해 기존 테이블에 행을 추가하세요. 매개변수는Path행까지의 전체 경로를 지정하며, 테이블의 기존 행 수보다 큰 행 수를 나타내야 합니다. 매개변수는Type추가할 항목 유형을 지정하라는 뜻Row입니다. 마지막으로, 이 매개변수는Value행의 칸마로 구분된 열 값 목록을 지정합니다.New-Item -Path mydb:\Customers\3 -ItemType "Row" -Value "3,CustomerFirstName,CustomerLastName,CustomerEmailAddress,CustomerTitle,CustomerCompany,CustomerPhone, CustomerAddress,CustomerCity,CustomerState,CustomerZip,CustomerCountry"다음 방식으로 새 항목 연산의 정확성을 확인하세요.
PS mydb:\> cd Customers PS mydb:\Customers> (Get-Item 3).Data다음 출력물이 나타난다.
ID : 3 FirstName : Eric LastName : Gruber Email : ericgruber@fabrikam.com Title : President Company : Fabrikam WorkPhone : (425) 555-0100 Address : 4567 Main Street City : Buffalo State : NY Zip : 98052 Country : USA
또한 참조하십시오
Windows PowerShell Provider 항목 구현
내비게이션 Windows PowerShell 제공자 구현