Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе объясняется, как создать поставщик Windows PowerShell с основными функциями создания нового диска. Общие сведения о поставщиках см. в обзорепоставщика Windows PowerShell. Примеры поставщиков с более полной функциональностью см. в примерах поставщиков.
Написание базового поставщика
Самыми основными функциями поставщика Windows PowerShell является создание и удаление дисков. В этом примере мы реализуем методы System.Management.Automation.Provider.DriveCmdletProvider.NewDrive* и System.Management.Automation.Provider.DriveCmdletProvider.RemoveDrive* класса System.Management.Automation.Provider.DriveCmdletProvider. Вы также увидите, как объявить класс поставщика.
При записи поставщика можно указать диски по умолчанию, которые создаются автоматически при доступности поставщика. Вы также определяете метод для создания новых дисков, использующих этот поставщик.
Примеры, приведенные в этом разделе, основаны на примере AccessDBProviderSample02, который является частью более крупного примера, представляющего базу данных Access в качестве диска Windows PowerShell.
Настройка проекта
В 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.КомандлетProviderAttribute, как показано в примере.
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* вызывается подсистемой Windows PowerShell, когда пользователь вызывает Microsoft.PowerShell.Commands.NewPSDriveCommand, указав имя поставщика. Параметр 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* вызывается подсистемой Windows PowerShell, когда пользователь вызывает командлет Microsoft.PowerShell.Commands.RemovePSDriveCommand. Метод в этом поставщике закрывает подключение к базе данных 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