Поделиться через


Создание поставщика элементов для Windows PowerShell

В этой теме описывается, как создать провайдера Windows PowerShell, который может обрабатывать данные в хранилище данных. В этой теме элементы данных в хранилище называются «элементами» хранилища данных. В результате провайдер, способный обрабатывать данные в хранилище, называется поставщиком элементов Windows PowerShell.

Замечание

Вы можете скачать исходный файл на C# (AccessDBSampleProvider03.cs) для этого провайдера с помощью Microsoft Windows Software Development Kit for Windows Vista и .NET Framework 3.0 Runtime Components. Инструкции по скачиванию смотрите в разделе «Как установить Windows PowerShell» и «Скачать Windows PowerShell SDK». Загруженные исходные файлы доступны в PowerShell Samples каталоге. Для получения дополнительной информации о других реализациях провайдеров Windows PowerShell см. раздел «Проектирование вашего провайдера Windows PowerShell».

Поставщик элементов Windows PowerShell, описанный в этой теме, получает элементы данных из базы данных Access. В этом случае «элемент» — это либо таблица в базе данных Access, либо строка в таблице.

Определение класса поставщика элементов Windows PowerShell

Поставщик элементов в Windows PowerShell должен определить класс .NET, который производится из базового класса System.Management.Automation.Provider.ItemCmdletProvider . Ниже приведено определение класса для поставщика элементов, описанного в этом разделе.

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

public class AccessDBProvider : ItemCmdletProvider

Обратите внимание, что в этом определении класса атрибут System.Management.Automation.Provider.CmdletProviderAttribute включает два параметра. Первый параметр задаёт удобное для пользователя имя провайдера, используемое Windows PowerShell. Второй параметр определяет специфические для Windows PowerShell возможности, которые провайдер открывает в процессе выполнения Windows PowerShell во время обработки команд. Для этого провайдера нет дополнительных возможностей, специфичных для Windows PowerShell.

Определение базовой функциональности

Как описано в статье Design Your Windows PowerShell Provider, класс System.Management.Automation.Provider.DriveCmdletProvider происходит из нескольких других классов, предоставлявших разные функциональности провайдеров. Таким образом, поставщик элементов Windows PowerShell должен определить все функции, предоставляемые этими классами.

Для получения дополнительной информации о том, как реализовать функционал добавления информации о инициализации, специфичной для сессии, и для освобождения ресурсов, используемых провайдером, см. раздел Создание базового провайдера Windows PowerShell. Однако большинство провайдеров, включая описанного здесь, могут использовать стандартную реализацию этой функциональности, предоставляемую Windows PowerShell.

Прежде чем провайдер элементов Windows PowerShell сможет управлять элементами в хранилище, он должен реализовать методы базового класса System.Management.Automation.Provider.DriveCmdletProvider для доступа к хранилищу данных. Для получения дополнительной информации о реализации этого класса см. раздел «Создание провайдера дисков Windows PowerShell».

Проверка валидности пути

При поиске элемента данных среда выполнения Windows PowerShell предоставляет провайдеру путь Windows PowerShell, как определено в разделе «PSPath Concepts» в разделе How Windows PowerShell Works. Поставщик элементов Windows PowerShell должен проверить синтаксическую и семантическую достоверность любого переданного ему пути, реализовав метод System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath . Этот метод возвращается true , если путь валиден, и false в противном случае. Имейте в виду, что реализация этого метода не должна проверять существование элемента на пути, а только наличие его синтаксической и семантической корректности.

Вот реализация метода 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 могут применяться следующие условия:

  • При определении класса провайдера поставщик элементов Windows PowerShell может объявить возможности провайдера , ExpandWildcardsFilter, Include, или Exclude, из перечисления System.Management.Automation.Provider.ProviderCapabilities. В таких случаях реализация метода System.Management.Automation.Provider.ItemCmdletProvider.ItemExists должна гарантировать, что путь, переданный к методу, соответствует требованиям указанных возможностей. Для этого метод должен получить доступ к соответствующим свойствам, например, к свойствам System.Management.Automation.Provider.CmdletProvider.Exclude и свойствам System.Management.Automation.Provider.CmdletProvider.Include .
  • Реализация этого метода должна обеспечивать любой доступ к элементу, который может сделать его видимым для пользователя. Например, если у пользователя есть доступ к записи файла через провайдера FileSystem (предоставленного Windows PowerShell), но нет доступа к чтению, файл всё равно существует, и System.Management.Automation.Provider.ItemCmdletProvider.ItemExists возвращает true. Ваша реализация может потребовать проверки родительского элемента, чтобы узнать, можно ли пересчитать дочерний элемент.

Прикрепление динамических параметров к Test-Path cmdlet

Иногда Test-Path cmdlet, вызывающий System.Management.Automation.Provider.ItemCmdletProvider.ItemExists , требует дополнительных параметров, которые динамически задаются во время выполнения. Для предоставления этих динамических параметров поставщик элементов Windows PowerShell должен реализовать метод System.Management.Automation.Provider.ItemCmdletProvider.ItemExistsDynamicParameters . Этот метод извлекает динамические параметры элемента по указанному пути и возвращает объект с свойствами и полями с атрибутами разбора, похожими на класс cmdlet или объект System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell использует возвращённый объект для добавления параметров в Test-Path cmdlet.

Этот провайдер элементов Windows PowerShell не реализует этот метод. Однако следующий код является стандартной реализацией этого метода.

Получение предмета

Чтобы получить элемент, провайдер элементов Windows PowerShell должен переопределить метод System.Management.Automation.Provider.ItemCmdletProvider.GetItem для поддержки вызовов из cmdlet Get-Item . Этот метод записывает элемент с помощью метода System.Management.Automation.Provider.CmdletProvider.WriteItemObject .

Вот реализация метода System.Management.Automation.Provider.ItemCmdletProvider.GetItem для этого провайдера. Обратите внимание, что этот метод использует методы помощников GetTable и GetRow для получения элементов, которые либо являются таблицами в базе данных 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 . Runtime Windows PowerShell использует возвращённый объект для добавления параметров в Get-Item cmdlet.

Этот провайдер не реализует этот метод. Однако следующий код является стандартной реализацией этого метода.

Установка предмета

Для установки элемента провайдер элементов Windows PowerShell должен переопределить метод System.Management.Automation.Provider.ItemCmdletProvider.SetItem для поддержки вызовов из Set-Item cmdlet. Этот метод устанавливает значение элемента на указанном пути.

Этот провайдер не предоставляет переопределения для метода System.Management.Automation.Provider.ItemCmdletProvider.SetItem (System.Management.Automation.Provider.Item ). Однако ниже приведена стандартная реализация этого метода.

Что нужно помнить при внедрении SetItem

Следующие условия могут применяться к вашей реализации System.Management.Automation.Provider.ItemCmdletProvider.SetItem:

Извлечение динамических параметров для SetItem

Иногда cmdlet Set-Item требует дополнительных параметров, которые динамически задаются во время выполнения. Для предоставления этих динамических параметров поставщик элементов Windows PowerShell должен реализовать метод System.Management.Automation.Provider.ItemCmdletProvider.SetItemDynamicParameters . Этот метод извлекает динамические параметры элемента по указанному пути и возвращает объект с свойствами и полями с атрибутами разбора, похожими на класс cmdlet или объект System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell использует возвращённый объект для добавления параметров в Set-Item cmdlet.

Этот провайдер не реализует этот метод. Однако следующий код является стандартной реализацией этого метода.

Очистка предмета

Для очистки элемента провайдер элементов Windows PowerShell реализует метод System.Management.Automation.Provider.ItemCmdletProvider.ClearItem для поддержки вызовов из Clear-Item cmdlet. Этот метод стирает элемент данных на указанном пути.

Этот провайдер не реализует этот метод. Однако следующий код является стандартной реализацией этого метода.

Что нужно помнить при внедрении ClearItem

К реализации System.Management.Automation.Provider.ItemCmdletProvider.ClearItem могут применяться следующие условия:

Получить динамические параметры для ClearItem

Иногда cmdlet Clear-Item требует дополнительных параметров, которые динамически задаются во время выполнения. Для предоставления этих динамических параметров поставщик элементов Windows PowerShell должен реализовать метод System.Management.Automation.Provider.ItemCmdletProvider.ClearItemDynamicParameters . Этот метод извлекает динамические параметры элемента по указанному пути и возвращает объект с свойствами и полями с атрибутами разбора, похожими на класс cmdlet или объект System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell использует возвращённый объект для добавления параметров в Clear-Item cmdlet.

Этот поставщик элементов не реализует этот метод. Однако следующий код является стандартной реализацией этого метода.

Выполнение действия по умолчанию для предмета

Провайдер элементов Windows PowerShell может реализовать метод System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction для поддержки вызовов из Invoke-Item cmdlet, что позволяет провайдеру выполнить действие по умолчанию для элемента на указанном пути. Например, провайдер 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 возвращённый объект добавлены для добавления динамических параметров в Invoke-Item cmdlet.

Этот поставщик элементов не реализует этот метод. Однако следующий код является стандартной реализацией этого метода.

Реализация вспомогательных методов и классов

Этот поставщик элементов реализует несколько вспомогательных методов и классов, которые используются в публичных методах переопределения, определённых Windows PowerShell. Код для этих вспомогательных методов и классов показан в разделе «Пример кода ».

Метод NormalizePath

Этот поставщик элементов реализует вспомогательный метод NormalizePath , чтобы обеспечить согласованный формат пути. Указанный формат использует обратную косую черту (\) в качестве разделителя.

Метод PathIsDrive

Этот поставщик элементов реализует вспомогательный метод PathIsDrive , чтобы определить, действительно ли указанный путь является именем диска.

Метод ChunkPath

Этот поставщик элементов реализует вспомогательный метод ChunkPath , который разбивает указанный путь, чтобы провайдер мог определить его отдельные элементы. Он возвращает массивы, состоящий из элементов пути.

Метод GetTable

Этот поставщик элементов реализует вспомогательный метод GetTables , который возвращает объект DatabaseTableInfo , представляющий информацию о таблице, указанной в вызове.

Метод GetRow

Метод System.Management.Automation.Provider.ItemCmdletProvider.GetItem этого провайдера вызывает метод помощника GetRows. Этот вспомогательный метод получает объект DatabaseRowInfo , который представляет информацию о указанной строке в таблице.

Класс DatabaseTableInfo

Этот поставщик элементов определяет класс DatabaseTableInfo , который представляет коллекцию информации в таблице данных в базе данных. Этот класс похож на класс System.IO.Directoryinfo .

Провайдер примера элементов определяет метод DatabaseTableInfo.GetTables , который возвращает коллекцию объектов информации таблицы, определяющих таблицы в базе данных. Этот метод включает блок try/catch, чтобы любая ошибка базы данных отображалась как строка с нулём записей.

Класс DatabaseRowInfo

Этот поставщик элементов определяет вспомогательный класс DatabaseRowInfo , который представляет строку в таблице базы данных. Этот класс похож на класс System.IO.FileInfo .

Примерный провайдер определяет метод DatabaseRowInfo.GetRows для возврата коллекции объектов информации о строках для указанной таблицы. Этот метод включает блок try/catch для ловли исключений. Любые ошибки приведут к отсутствию информации о строке.

Пример кода

Полный пример кода см. AccessDbProviderSample03 Code Sample03.

Определение типов объектов и форматирования

При написании провайдера может потребоваться добавить элементы к существующим объектам или определить новые. После завершения создайте файл Types, который Windows PowerShell сможет использовать для идентификации членов объекта, а также файл Format, который определяет, как объект отображается. Для получения дополнительной информации см. раздел «Расширение типов объектов и форматирования».

Создание провайдера Windows PowerShell

Посмотрите, как зарегистрировать cmdlet, провайдеров и хост-приложения.

Тестирование провайдера Windows PowerShell

Когда этот поставщик элементов Windows PowerShell зарегистрирован в Windows PowerShell, вы можете протестировать только базовую и дисковую функциональность провайдера. Для тестирования манипуляции элементами необходимо также реализовать функциональность контейнера, описанную в разделе «Реализация контейнера Windows PowerShell Provider».

См. также