Создание поставщика контейнеров Windows PowerShell

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

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

Примечание

исходный файл C# (AccessDBSampleProvider04. cs) для этого поставщика можно скачать с помощью пакета средств разработки Microsoft Windows Software Development Kit для компонентов среды выполнения Windows Vista и платформа .NET Framework 3,0. инструкции по загрузке см. в статье установка Windows PowerShell и загрузка пакета SDK для Windows PowerShell. Скачанные исходные файлы доступны в <PowerShell Samples> каталоге. дополнительные сведения о других реализациях поставщиков Windows PowerShell см. в разделе разработка поставщика Windows PowerShell.

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

Внимание!

Имейте в виду, что в этом проекте предполагается, что база данных имеет поле с ИДЕНТИФИКАТОРом Name, а тип поля — Лонгинтежер.

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

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

[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ContainerCmdletProvider

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

Определение базовых функций

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

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

Чтобы получить доступ к хранилищу данных, поставщик должен реализовать методы базового класса System. Management. Automation. Provider. дривекмдлетпровидер . дополнительные сведения о реализации этих методов см. в разделе создание поставщика Windows PowerShell диска.

Чтобы управлять элементами хранилища данных, такими как получение, установка и очистка элементов, поставщик должен реализовать методы, предоставляемые базовым классом System. Management. Automation. Provider. итемкмдлетпровидер . дополнительные сведения о реализации этих методов см. в разделе создание поставщика Windows PowerShell элемента.

Получение дочерних элементов

чтобы получить дочерний элемент, поставщик контейнера Windows PowerShell должен переопределить метод System. Management. Automation. provider. контаинеркмдлетпровидер. жетчилдитемс * для поддержки вызовов из Get-ChildItem командлета. Этот метод получает дочерние элементы из хранилища данных и записывает их в конвейер в виде объектов. Если recurse указан параметр командлета, метод получает все дочерние элементы независимо от того, на каком уровне они находятся. Если recurse параметр не указан, метод извлекает только один уровень дочерних элементов.

Ниже приведена реализация метода System. Management. Automation. Provider. контаинеркмдлетпровидер. жетчилдитемс * для этого поставщика. Обратите внимание, что этот метод получает дочерние элементы во всех таблицах базы данных, если путь указывает на базу данных 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

Вопросы, связанные с реализацией Жетчилдитемс

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

Присоединение динамических параметров к командлету Get-ChildItem

Иногда Get-ChildItem командлет, вызывающий System. Management. Automation. Provider. Контаинеркмдлетпровидер. жетчилдитемс * , требует дополнительных параметров, заданных динамически во время выполнения. чтобы предоставить эти динамические параметры, поставщик контейнера Windows PowerShell должен реализовать метод System. Management. автоматизации. provider. контаинеркмдлетпровидер. жетчилдитемсдинамикпараметерс * . Этот метод получает динамические параметры для элемента по указанному пути и возвращает объект со свойствами и полями с атрибутами синтаксического анализа, похожими на класс командлета или объект System. Management. Automation. рунтимедефинедпараметердиктионари . среда выполнения Windows PowerShell использует возвращаемый объект для добавления параметров в Get-ChildItem командлет.

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

Получение имен дочерних элементов

чтобы получить имена дочерних элементов, поставщик контейнера Windows PowerShell должен переопределить метод System. Management. Automation. provider. контаинеркмдлетпровидер. жетчилднамес * для поддержки вызовов из Get-ChildItem командлета, если его Name параметр указан. Этот метод получает имена дочерних элементов для указанных пути или имен дочерних элементов для всех контейнеров, если returnAllContainers указан параметр командлета. Дочернее имя — это конечная часть пути. Например, дочерним именем для пути c:\windows\system32\abc.dll является "abc.dll". Дочернее имя каталога c:\Windows\System32 — System32.

Ниже приведена реализация метода System. Management. Automation. Provider. контаинеркмдлетпровидер. жетчилднамес * для этого поставщика. Обратите внимание, что метод получает имена таблиц, если указанный путь указывает на базу данных 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

Вопросы, связанные с реализацией Жетчилднамес

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

Присоединение динамических параметров к командлету Get-ChildItem (Name)

Иногда Get-ChildItem командлету (с Name параметром) требуются дополнительные параметры, заданные динамически во время выполнения. чтобы предоставить эти динамические параметры, поставщик контейнера Windows PowerShell должен реализовать метод System. Management. автоматизации. provider. контаинеркмдлетпровидер. жетчилднамесдинамикпараметерс * . Этот метод получает динамические параметры для элемента по указанному пути и возвращает объект со свойствами и полями с атрибутами синтаксического анализа, похожими на класс командлета или объект System. Management. Automation. рунтимедефинедпараметердиктионари . среда выполнения Windows PowerShell использует возвращаемый объект для добавления параметров в Get-ChildItem командлет.

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

Переименование элементов

для переименования элемента поставщик контейнера Windows PowerShell должен переопределять метод System. Management. Automation. provider. контаинеркмдлетпровидер. ренамеитем * для поддержки вызовов из Rename-Item командлета. Этот метод изменяет имя элемента по указанному пути на новое указанное имя. Новое имя всегда должно относиться к родительскому элементу (контейнеру).

Этот поставщик не переопределяет метод System. Management. Automation. Provider. контаинеркмдлетпровидер. ренамеитем * . Однако ниже приведена реализация по умолчанию.

Вопросы, связанные с реализацией Ренамеитем

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

Присоединение динамических параметров к командлету Rename-Item

Иногда Rename-Item командлету требуются дополнительные параметры, которые задаются динамически во время выполнения. чтобы предоставить эти динамические параметры, Windows PowerShell поставщик контейнера должен реализовать метод System. Management. Automation. provider. контаинеркмдлетпровидер. ренамеитемдинамикпараметерс * . Этот метод получает параметры для элемента по указанному пути и возвращает объект со свойствами и полями с атрибутами синтаксического анализа, похожими на класс командлета или объект System. Management. Automation. рунтимедефинедпараметердиктионари . среда выполнения Windows PowerShell использует возвращаемый объект для добавления параметров в Rename-Item командлет.

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

Создание новых элементов

Для создания новых элементов поставщик контейнера должен реализовать метод System. Management. Automation. Provider. контаинеркмдлетпровидер. newItem * для поддержки вызовов из New-Item командлета. Этот метод создает элемент данных, расположенный по указанному пути. typeПараметр командлета содержит тип, определяемый поставщиком для нового элемента. Например, Поставщик FileSystem использует type параметр со значением "File" или "Directory". newItemValueПараметр командлета задает зависящее от поставщика значение для нового элемента.

Ниже приведена реализация метода System. Management. Automation. Provider. контаинеркмдлетпровидер. 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. контаинеркмдлетпровидер. newItem *:

Присоединение динамических параметров к командлету New-Item

Иногда New-Item командлету требуются дополнительные параметры, которые задаются динамически во время выполнения. Чтобы предоставить эти динамические параметры, поставщик контейнера должен реализовать метод System. Management. автоматизации. Provider. контаинеркмдлетпровидер. невитемдинамикпараметерс * . Этот метод получает параметры для элемента по указанному пути и возвращает объект со свойствами и полями с атрибутами синтаксического анализа, похожими на класс командлета или объект System. Management. Automation. рунтимедефинедпараметердиктионари . среда выполнения Windows PowerShell использует возвращаемый объект для добавления параметров в New-Item командлет.

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

Удаление элементов

чтобы удалить элементы, поставщик Windows PowerShell должен переопределить метод System. Management. Automation. provider. контаинеркмдлетпровидер. Removeitem * для поддержки вызовов из Remove-Item командлета. Этот метод удаляет элемент из хранилища данных по указанному пути. Если recurse параметр Remove-Item командлета имеет значение true , метод удаляет все дочерние элементы независимо от их уровня. Если параметр имеет значение false , метод удаляет только один элемент по указанному пути.

Этот поставщик не поддерживает удаление элементов. Однако следующий код является реализацией класса System. Management. Automation. Provider. контаинеркмдлетпровидер. RemoveItem *по умолчанию.

Вопросы, связанные с реализацией RemoveItem

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

Присоединение динамических параметров к командлету Remove-Item

Иногда Remove-Item командлету требуются дополнительные параметры, которые задаются динамически во время выполнения. Чтобы предоставить эти динамические параметры, поставщик контейнера должен реализовать метод System. Management. Automation. Provider. контаинеркмдлетпровидер. ремовеитемдинамикпараметерс * для работы с этими параметрами. Этот метод получает динамические параметры для элемента по указанному пути и возвращает объект со свойствами и полями с атрибутами синтаксического анализа, похожими на класс командлета или объект System. Management. Automation. рунтимедефинедпараметердиктионари . среда выполнения Windows PowerShell использует возвращаемый объект для добавления параметров в Remove-Item командлет.

Этот метод не реализуется этим поставщиком контейнера. Однако следующий код является реализацией класса System. Management. Automation. Provider. контаинеркмдлетпровидер. ремовеитемдинамикпараметерс *по умолчанию.

Запрос дочерних элементов

чтобы проверить существование дочерних элементов по указанному пути, поставщик контейнера Windows PowerShell должен переопределить метод System. Management. Automation. provider. контаинеркмдлетпровидер. хасчилдитемс * . Этот метод возвращает true , если элемент имеет дочерние элементы, и false в противном случае. Для неопределенного или пустого пути метод считает, что все элементы в хранилище данных являются дочерними, и возвращает true .

Ниже приведено переопределение для метода System. Management. Automation. Provider. контаинеркмдлетпровидер. хасчилдитемс * . При наличии более двух частей пути, созданных вспомогательным методом Чункпас, метод возвращает false , так как определены только контейнер базы данных и контейнер таблицы. дополнительные сведения об этом вспомогательном методе см. в описании метода чункпас в разделе создание поставщика Windows PowerShell элемента.

protected override bool HasChildItems( string path )
{
    return false;
} // HasChildItems
        ErrorCategory.InvalidOperation, tableName));
}

return results;

Вопросы, связанные с реализацией Хасчилдитемс

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

Копирование элементов

Для копирования элементов поставщик контейнера должен реализовать метод System. Management. Automation. Provider. контаинеркмдлетпровидер. CopyItem для поддержки вызовов из Copy-Item командлета. Этот метод копирует элемент данных из расположения, указанного path параметром командлета, в расположение, указанное copyPath параметром. Если recurse указан параметр, метод копирует все подконтейнеры. Если параметр не указан, метод копирует только один уровень элементов.

Этот метод не реализуется этим поставщиком. Однако следующий код является реализацией класса System. Management. Automation. Provider. контаинеркмдлетпровидер. CopyItemпо умолчанию.

Вопросы, связанные с реализацией CopyItem

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

Присоединение динамических параметров к командлету Copy-Item

Иногда Copy-Item командлету требуются дополнительные параметры, которые задаются динамически во время выполнения. чтобы предоставить эти динамические параметры, поставщик контейнера Windows PowerShell должен реализовать метод System. Management. Automation. provider. контаинеркмдлетпровидер. копитемдинамикпараметерс * , чтобы обрабатывал эти параметры. Этот метод получает параметры для элемента по указанному пути и возвращает объект со свойствами и полями с атрибутами синтаксического анализа, похожими на класс командлета или объект System. Management. Automation. рунтимедефинедпараметердиктионари . среда выполнения Windows PowerShell использует возвращаемый объект для добавления параметров в Copy-Item командлет.

Этот метод не реализуется этим поставщиком. Однако следующий код является реализацией класса System. Management. Automation. Provider. контаинеркмдлетпровидер. копитемдинамикпараметерс *по умолчанию.

Образец кода

Полный пример кода см. в разделе пример кода AccessDbProviderSample04.

создание поставщика Windows PowerShell

См. раздел Регистрация командлетов, поставщиков и ведущих приложений.

тестирование поставщика Windows PowerShell

когда поставщик Windows PowerShell зарегистрирован в Windows PowerShell, его можно проверить, запустив в командной строке поддерживаемые командлеты. Имейте в виду, что в следующем примере выходных данных используется вымышленная БД Access.

  1. Выполните Get-ChildItem командлет, чтобы получить список дочерних элементов из таблицы Customers в базе данных Access.

    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       :
    
  2. Запустите Get-ChildItem командлет еще раз, чтобы получить данные таблицы.

    (Get-ChildItem mydb:customers).data
    

    Появится следующий результат.

    TABLE_CAT   : c:\PS\northwind
    TABLE_SCHEM :
    TABLE_NAME  : Customers
    TABLE_TYPE  : TABLE
    REMARKS     :
    
  3. Теперь используйте 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     : 0
    
  4. Повторное использование Get-Item для получения данных для элементов в строке 0.

    (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
    
  5. Теперь используйте 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"
    
  6. Проверьте правильность операции создания элемента следующим образом.

    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

Разработка поставщика Windows PowerShell

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

реализация поставщика Windows PowerShell навигации

Регистрация командлетов, поставщиков и ведущих приложений

Пакет SDK для Windows PowerShell

Руководство программиста по Windows PowerShell