Windows PowerShell 공급자 빠른 시작
이 항목에서는 새 드라이브를 만드는 기본 기능이 있는 Windows PowerShell 공급자를 만드는 방법을 설명합니다. 공급자에 대한 일반적인 내용은 Windows PowerShell 공급자 개요참조하세요. 보다 완전한 기능을 갖춘 공급자의 예는 공급자 샘플참조하세요.
기본 공급자 작성
Windows PowerShell 공급자의 가장 기본적인 기능은 드라이브를 만들고 제거하는 것입니다. 이 예제에서는 System.Management.Automation.Provider.DriveCmdletProvider 클래스의 system.Management.Automation.Provider.DriveCmdletProvider.NewDrive* 및 System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* 메서드를 구현합니다. 공급자 클래스를 선언하는 방법도 표시됩니다.
공급자를 작성할 때 공급자를 사용할 수 있을 때 자동으로 생성되는 기본 드라이브 드라이브를 지정할 수 있습니다. 또한 해당 공급자를 사용하는 새 드라이브를 만드는 메서드를 정의합니다.
이 항목에 제공된 예제는 Access 데이터베이스를 Windows PowerShell 드라이브로 나타내는 더 큰 샘플의 일부인 AccessDBProviderSample02 샘플을 기반으로 합니다.
프로젝트 설정
Visual Studio에서 AccessDBProviderSample이라는 클래스 라이브러리 프로젝트를 만듭니다. 다음 단계를 완료하여 프로젝트를 빌드하고 시작할 때 Windows PowerShell이 시작되고 공급자가 세션에 로드되도록 프로젝트를 구성합니다.
공급자 프로젝트 구성
System.Management.Automation 어셈블리를 프로젝트에 대한 참조로 추가합니다.
Project > AccessDBProviderSample 속성 > 디버그클릭합니다. 시작 프로젝트외부 프로그램시작을 클릭하고 Windows PowerShell 실행 파일(일반적으로 C:\Windows\System32\WindowsPowerShell\v1.0\.powershell.exe)으로 이동합니다.
시작 옵션명령줄 인수 상자에 다음을 입력합니다.
-NoExit -Command "[Reflection.Assembly]::LoadFrom(AccessDBProviderSample.dll' ) | Import-Module"
공급자 클래스 선언
공급자는 System.Management.Automation.Provider.DriveCmdletProvider 클래스에서 파생됩니다. 실제 기능(항목 액세스 및 조작, 데이터 저장소 탐색 및 항목 콘텐츠 가져오기 및 설정)을 제공하는 대부분의 공급자는 System.Management.Automation.Provider.NavigationCmdletProvider 클래스에서 파생됩니다.
클래스가 System.Management.Automation.Provider.DriveCmdletProvider파생되도록 지정하는 것 외에도 예제와 같이 system.Management.Automation.Provider.CmdletProviderAttribute 데코레이트해야 합니다.
namespace Microsoft.Samples.PowerShell.Providers
{
using System;
using System.Data;
using System.Data.Odbc;
using System.IO;
using System.Management.Automation;
using System.Management.Automation.Provider;
#region AccessDBProvider
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : DriveCmdletProvider
{
}
}
NewDrive 구현
System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* 메서드는 사용자가 공급자의 이름을 지정하는 Microsoft.PowerShell.Commands.NewPSDriveCommand cmdlet을 호출할 때 Windows PowerShell 엔진에서 호출됩니다. PSDriveInfo 매개 변수는 Windows PowerShell 엔진에서 전달되며 이 메서드는 새 드라이브를 Windows PowerShell 엔진에 반환합니다. 이 메서드는 위에서 만든 클래스 내에서 선언해야 합니다.
이 메서드는 먼저 드라이브 개체와 전달된 드라이브 루트가 모두 있는지 확인하고 둘 중 하나가 없는 경우 null
반환합니다. 그런 다음 내부 클래스 AccessDBPSDriveInfo의 생성자를 사용하여 새 드라이브를 만들고 드라이브가 나타내는 Access 데이터베이스에 대한 연결을 만듭니다.
protected override PSDriveInfo NewDrive(PSDriveInfo drive)
{
// Check if the drive object is null.
if (drive == null)
{
WriteError(new ErrorRecord(
new ArgumentNullException("drive"),
"NullDrive",
ErrorCategory.InvalidArgument,
null));
return null;
}
// Check if the drive root is not null or empty
// and if it is an existing file.
if (String.IsNullOrEmpty(drive.Root) || (File.Exists(drive.Root) == false))
{
WriteError(new ErrorRecord(
new ArgumentException("drive.Root"),
"NoRoot",
ErrorCategory.InvalidArgument,
drive));
return null;
}
// Create a new drive and create an ODBC connection to the new drive.
AccessDBPSDriveInfo accessDBPSDriveInfo = new AccessDBPSDriveInfo(drive);
OdbcConnectionStringBuilder builder = new OdbcConnectionStringBuilder();
builder.Driver = "Microsoft Access Driver (*.mdb)";
builder.Add("DBQ", drive.Root);
OdbcConnection conn = new OdbcConnection(builder.ConnectionString);
conn.Open();
accessDBPSDriveInfo.Connection = conn;
return accessDBPSDriveInfo;
}
다음은 새 드라이브를 만드는 데 사용되는 생성자를 포함하고 드라이브에 대한 상태 정보를 포함하는 AccessDBPSDriveInfo 내부 클래스입니다.
internal class AccessDBPSDriveInfo : PSDriveInfo
{
/// <summary>
/// A reference to the connection to the database.
/// </summary>
private OdbcConnection connection;
/// <summary>
/// Initializes a new instance of the AccessDBPSDriveInfo class.
/// The constructor takes a single argument.
/// </summary>
/// <param name="driveInfo">Drive defined by this provider</param>
public AccessDBPSDriveInfo(PSDriveInfo driveInfo)
: base(driveInfo)
{
}
/// <summary>
/// Gets or sets the ODBC connection information.
/// </summary>
public OdbcConnection Connection
{
get { return this.connection; }
set { this.connection = value; }
}
}
RemoveDrive 구현
System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* 메서드는 사용자가 Microsoft.PowerShell.Commands.RemovePSDriveCommand cmdlet을 호출할 때 Windows PowerShell 엔진에서 호출됩니다. 이 공급자의 메서드는 Access 데이터베이스에 대한 연결을 닫습니다.
protected override PSDriveInfo RemoveDrive(PSDriveInfo drive)
{
// Check if drive object is null.
if (drive == null)
{
WriteError(new ErrorRecord(
new ArgumentNullException("drive"),
"NullDrive",
ErrorCategory.InvalidArgument,
drive));
return null;
}
// Close the ODBC connection to the drive.
AccessDBPSDriveInfo accessDBPSDriveInfo = drive as AccessDBPSDriveInfo;
if (accessDBPSDriveInfo == null)
{
return null;
}
accessDBPSDriveInfo.Connection.Close();
return accessDBPSDriveInfo;
}
PowerShell