Creating a Windows PowerShell Container Provider (Criar um Fornecedor de Contentores do Windows PowerShell)

Este tópico descreve como criar um fornecedor Windows PowerShell que possa trabalhar em lojas de dados de várias camadas. Para este tipo de armazenamento de dados, o nível superior da loja contém os itens de raiz e cada nível subsequente é referido como um nó de itens infantis. Ao permitir que o utilizador trabalhe nestes nós infantis, um utilizador pode interagir hierárquicamente através da loja de dados.

Os fornecedores que podem trabalhar em lojas de dados de vários níveis são referidos como fornecedores de contentores Windows PowerShell. No entanto, tenha em atenção que um fornecedor de recipientes Windows PowerShell só pode ser utilizado quando existe um recipiente (sem contentores aninhados) com objetos nele. Se existirem recipientes aninhados, deve implementar um fornecedor de navegação Windows PowerShell. Para obter mais informações sobre a implementação Windows PowerShell fornecedor de navegação, consulte criar um Fornecedor de Navegação Windows PowerShell.

Nota

Pode descarregar o ficheiro de origem C# (AccessDBSampleProvider04.cs) para este fornecedor utilizando o Microsoft Windows Software Development Kit para Windows Vista e .NET Framework componentes de tempo de execução 3.0. Para obter instruções de descarregamento, consulte Como instalar Windows PowerShell e descarregue o Windows PowerShell SDK. Os ficheiros de origem descarregados estão disponíveis no <PowerShell Samples> diretório. Para obter mais informações sobre outras implementações Windows PowerShell do fornecedor, consulte Designing Your Windows PowerShell Provider.

O Windows PowerShell fornecedor de contentores aqui descrito define a base de dados como o seu único contentor, com as tabelas e linhas da base de dados definidas como itens do contentor.

Atenção

Esteja ciente de que este design assume uma base de dados que tem um campo com o nome ID, e que o tipo de campo é LongInteger.

Definição de uma classe de fornecedor de recipientes Windows PowerShell

Um fornecedor de contentores Windows PowerShell deve definir uma classe .NET que deriva da classe base System.Management.Automation.Provider.Containercmdletprovider. Aqui está a definição de classe para o fornecedor de contentores Windows PowerShell descrito nesta secção.

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

Note que nesta definição de classe, o atributo System.Management.Automation.Provider.Cmdletproviderattribute inclui dois parâmetros. O primeiro parâmetro especifica um nome fácil de utilizar para o fornecedor que é utilizado por Windows PowerShell. O segundo parâmetro especifica as capacidades específicas Windows PowerShell que o fornecedor expõe ao tempo de execução Windows PowerShell durante o processamento do comando. Para este fornecedor, não existem capacidades específicas Windows PowerShell que sejam adicionadas.

Definição da funcionalidade base

Conforme descrito no Designing Your Windows PowerShell Provider, a classe System.Management.Automation.Provider.Containercmdletprovider deriva de várias outras classes que forneceram diferentes funcionalidades do fornecedor. Um fornecedor de contentores Windows PowerShell precisa, portanto, de definir todas as funcionalidades fornecidas por essas classes.

Para implementar a funcionalidade de adição de informações de inicialização específicas da sessão e para a libertação de recursos utilizados pelo fornecedor, consulte criar um Fornecedor de Windows PowerShell Básico. No entanto, a maioria dos fornecedores (incluindo o fornecedor aqui descrito) podem utilizar a implementação padrão desta funcionalidade que é fornecida por Windows PowerShell.

Para ter acesso à loja de dados, o fornecedor deve implementar os métodos da classe base System.Management.Automation.Provider.Drivecmdletprovider. Para obter mais informações sobre a implementação destes métodos, consulte criar um fornecedor de unidade Windows PowerShell.

Para manipular os itens de uma loja de dados, tais como obter, configurar e limpar itens, o fornecedor deve implementar os métodos fornecidos pela classe base System.Management.Automation.Provider.Itemcmdletprovider base class. Para obter mais informações sobre a implementação destes métodos, consulte criar um fornecedor de artigos Windows PowerShell.

Recuperação de itens para crianças

Para recuperar um item para crianças, o fornecedor de recipientes Windows PowerShell deve sobrepor-se ao método System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* para suportar as chamadas do Get-ChildItem cmdlet. Este método recupera objetos infantis da loja de dados e escreve-os para o oleoduto como objetos. Se o recurse parâmetro do cmdlet for especificado, o método recupera todas as crianças independentemente do nível em que estejam. Se o recurse parâmetro não for especificado, o método recupera apenas um único nível de crianças.

Eis a implementação do método System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* para este fornecedor. Note que este método recupera os itens da criança em todas as tabelas de bases de dados quando o caminho indica a base de dados Access e recupera os itens da criança das linhas dessa tabela se o caminho indicar uma tabela de dados.

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

Coisas a lembrar sobre implementar GetChildItems

As seguintes condições podem aplicar-se à sua implementação do System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*

Anexação de parâmetros dinâmicos ao Get-ChildItem Cmdlet

Por Get-ChildItem vezes, o cmdlet que chama System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* requer parâmetros adicionais que são especificados dinamicamente no tempo de execução. Para fornecer estes parâmetros dinâmicos, o fornecedor de contentores Windows PowerShell deve implementar o método System.Management.Automation.Provider.Containercmdletprovider.Getchilditemsdynamicparameters*. Este método recupera parâmetros dinâmicos para o item no caminho indicado e devolve um objeto que tem propriedades e campos com atributos de parsing semelhantes a uma classe cmdlet ou um dispositivo System.Management.Automation.Runtimedefinedparametrtionary object. O tempo de execução Windows PowerShell utiliza o objeto devolvido para adicionar os parâmetros ao Get-ChildItem cmdlet.

Este Windows PowerShell fornecedor de contentores não implementa este método. No entanto, o seguinte código é a implementação padrão deste método.

Recuperação de nomes de artigos para crianças

Para recuperar os nomes dos artigos para crianças, o fornecedor de recipientes Windows PowerShell deve sobrepor-se ao método System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* para suportar chamadas do Get-ChildItem cmdlet quando o seu parâmetro for Name especificado. Este método recupera os nomes dos itens da criança para o caminho especificado ou nomes de objetos infantis para todos os recipientes se o returnAllContainers parâmetro do cmdlet for especificado. Um nome de criança é a parte da folha de um caminho. Por exemplo, o nome da criança para o caminho c:\windows\system32\abc.dll é "abc.dll". O nome da criança para o diretório c:\windows\system32 é "system32".

Eis a implementação do método System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* para este fornecedor. Note que o método recupera nomes de tabelas se o caminho especificado indicar a base de dados de Acesso (unidade) e os números de linha se o caminho indicar uma tabela.

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

Coisas a lembrar sobre implementar GetChildNames

As seguintes condições podem aplicar-se à sua implementação do System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*

Anexação de parâmetros dinâmicos ao Get-ChildItem Cmdlet (Nome)

Por Get-ChildItem vezes, o cmdlet (com o Name parâmetro) requer parâmetros adicionais que são especificados dinamicamente no tempo de execução. Para fornecer estes parâmetros dinâmicos, o fornecedor de recipientes Windows PowerShell deve implementar o método System.Management.Automation.Provider.Containercmdletprovider.Getchildnamesdynamicparameters*. Este método recupera os parâmetros dinâmicos do item no caminho indicado e devolve um objeto que tem propriedades e campos com atributos de parsing semelhantes a uma classe cmdlet ou a um system.Management.Automation.Executtimedefinedparametrtiontion object. O tempo de execução Windows PowerShell utiliza o objeto devolvido para adicionar os parâmetros ao Get-ChildItem cmdlet.

Este fornecedor não implementa este método. No entanto, o seguinte código é a implementação padrão deste método.

Renomear Itens

Para renomear um item, um fornecedor de contentores Windows PowerShell deve sobrepor-se ao método System.Management.Automation.Provider.Containercmdletprovider.Renameitem*para suportar chamadas a partir do Rename-Item cmdlet. Este método altera o nome do item no caminho especificado para o novo nome fornecido. O novo nome deve ser sempre relativo ao item-mãe (recipiente).

Este fornecedor não substitui o método System.Management.Automation.Provider.Containercmdletprovider.Renameitem*. No entanto, o seguinte é a implementação padrão.

Coisas a lembrar sobre implementar renomeadorItem

As seguintes condições podem aplicar-se à sua implementação do System.Management.Automation.Provider.Containercmdletprovider.Renameitem*

Anexação de parâmetros dinâmicos ao Rename-Item Cmdlet

Por Rename-Item vezes, o cmdlet requer parâmetros adicionais que são especificados dinamicamente no tempo de execução. Para fornecer estes parâmetros dinâmicos, Windows PowerShell fornecedor de contentores deve implementar o método System.Management.Automation.Provider.Containercmdletprovider.Rebatitemdynamicparameters*. Este método recupera os parâmetros do item no caminho indicado e devolve um objeto que tem propriedades e campos com atributos de parsing semelhantes a uma classe cmdlet ou a um system.Management.Automation.Runtimedefinedparametrtionary object. O tempo de execução Windows PowerShell utiliza o objeto devolvido para adicionar os parâmetros ao Rename-Item cmdlet.

Este fornecedor de contentores não implementa este método. No entanto, o seguinte código é a implementação padrão deste método.

Criação de novos itens

Para criar novos itens, um fornecedor de contentores deve implementar o método System.Management.Automation.Provider.Containercmdletprovider.Newitem* para suportar chamadas a partir do New-Item cmdlet. Este método cria um item de dados localizado no caminho especificado. O type parâmetro do cmdlet contém o tipo definido pelo fornecedor para o novo item. Por exemplo, o fornecedor FileSystem utiliza um type parâmetro com o valor de "ficheiro" ou "diretório". O newItemValue parâmetro do cmdlet especifica um valor específico do fornecedor para o novo item.

Eis a implementação do método System.Management.Automation.Provider.Containercmdletprovider.Newitem* para este fornecedor.

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];

Coisas a lembrar sobre implementar o NewItem

As seguintes condições podem aplicar-se à sua implementação do System.Management.Automation.Provider.Containercmdletprovider.Newitem*

Anexação de parâmetros dinâmicos ao New-Item Cmdlet

Por New-Item vezes, o cmdlet requer parâmetros adicionais que são especificados dinamicamente no tempo de execução. Para fornecer estes parâmetros dinâmicos, o fornecedor de recipientes deve implementar o método System.Management.Automation.Provider.Containercmdletprovider.Newitemdynamicparameters*. Este método recupera os parâmetros do item no caminho indicado e devolve um objeto que tem propriedades e campos com atributos de parsing semelhantes a uma classe cmdlet ou a um system.Management.Automation.Runtimedefinedparametrtionary object. O tempo de execução Windows PowerShell utiliza o objeto devolvido para adicionar os parâmetros ao New-Item cmdlet.

Este fornecedor não implementa este método. No entanto, o seguinte código é a implementação padrão deste método.

Remoção de Itens

Para remover os itens, o fornecedor Windows PowerShell deve sobrepor-se ao método System.Management.Automation.Provider.Containercmdletprovider.Removeitem* para suportar chamadas do Remove-Item cmdlet. Este método elimina um item da loja de dados no caminho especificado. Se o recurse parâmetro do Remove-Item cmdlet estiver true definido, o método remove todos os itens infantis, independentemente do seu nível. Se o parâmetro for false definido, o método remove apenas um único item no caminho especificado.

Este fornecedor não suporta a remoção do artigo. No entanto, o seguinte código é a implementação predefinitiva do System.Management.Automation.Provider.Containercmdletprovider.Removeitem*.

Coisas a lembrar sobre implementar removeitem

As seguintes condições podem aplicar-se à sua implementação do System.Management.Automation.Provider.Containercmdletprovider.Newitem*

Anexação de parâmetros dinâmicos ao Remove-Item Cmdlet

Por Remove-Item vezes, o cmdlet requer parâmetros adicionais que são especificados dinamicamente no tempo de execução. Para fornecer estes parâmetros dinâmicos, o fornecedor de recipientes deve implementar o método System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters* para lidar com estes parâmetros. Este método recupera os parâmetros dinâmicos do item no caminho indicado e devolve um objeto que tem propriedades e campos com atributos de parsing semelhantes a uma classe cmdlet ou a um system.Management.Automation.Executtimedefinedparametrtiontion object. O tempo de execução Windows PowerShell utiliza o objeto devolvido para adicionar os parâmetros ao Remove-Item cmdlet.

Este fornecedor de contentores não implementa este método. No entanto, o seguinte código é a implementação padrão do System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters*.

Consulta de itens infantis

Para verificar se existem itens para crianças no caminho especificado, o fornecedor de recipientes Windows PowerShell deve sobrepor-se ao método System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*. Este método devolve true se o item tiver filhos, e de outra false forma. Para um caminho nulo ou vazio, o método considera que quaisquer itens na loja de dados são crianças e devoluções true .

Aqui está a sobreposição para o método System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*. Se existirem mais de duas peças de caminho criadas pelo método do ajudante ChunkPath, o método retorna, false uma vez que apenas um recipiente de base de dados e um recipiente de mesa são definidos. Para obter mais informações sobre este método de ajuda, consulte o método ChunkPath na Criação de um fornecedor de Windows PowerShell item.

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

return results;

Coisas a lembrar sobre implementar haschilditems

As seguintes condições podem aplicar-se à sua implementação do System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*

Itens de cópia

Para copiar itens, o fornecedor de recipientes deve implementar o método System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem para suportar chamadas do Copy-Item cmdlet. Este método copia um item de dados da localização indicada pelo path parâmetro do cmdlet para a localização indicada pelo copyPath parâmetro. Se o recurse parâmetro for especificado, o método copia todos os subcongrupos. Se o parâmetro não for especificado, o método copia apenas um único nível de itens.

Este fornecedor não implementa este método. No entanto, o seguinte código é a implementação padrão do System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem.

Coisas a lembrar sobre implementar copyItem

As seguintes condições podem aplicar-se à sua implementação do System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem:

Anexação de parâmetros dinâmicos ao Copy-Item Cmdlet

Por Copy-Item vezes, o cmdlet requer parâmetros adicionais que são especificados dinamicamente no tempo de execução. Para fornecer estes parâmetros dinâmicos, o fornecedor de recipientes Windows PowerShell deve implementar o método System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters* para lidar com estes parâmetros. Este método recupera os parâmetros do item no caminho indicado e devolve um objeto que tem propriedades e campos com atributos de parsing semelhantes a uma classe cmdlet ou a um system.Management.Automation.Runtimedefinedparametrtionary object. O tempo de execução Windows PowerShell utiliza o objeto devolvido para adicionar os parâmetros ao Copy-Item cmdlet.

Este fornecedor não implementa este método. No entanto, o seguinte código é a implementação padrão do System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters*.

Amostra de código

Para obter o código de amostra completo, consulte AccessDbProviderSample04 Code Sample.

Construção do Provedor de Windows PowerShell

Ver Como Registar Cmdlets, Fornecedores e Aplicações de Anfitrião.

Testar o Provedor de Windows PowerShell

Quando o seu fornecedor Windows PowerShell estiver registado com Windows PowerShell, pode testá-lo executando os cmdlets suportados na linha de comando. Esteja ciente de que a saída de exemplo a seguir utiliza uma base de dados de acesso fictícia.

  1. Executar o Get-ChildItem cmdlet para recuperar a lista de itens infantis de uma tabela clientes na base de dados Access.

    Get-ChildItem mydb:customers
    

    Aparece a seguinte saída.

    PSPath        : AccessDB::customers
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : True
    Data          : System.Data.DataRow
    Name          : Customers
    RowCount      : 91
    Columns       :
    
  2. Volte a executar o Get-ChildItem cmdlet para recuperar os dados de uma tabela.

    (Get-ChildItem mydb:customers).data
    

    Aparece a seguinte saída.

    TABLE_CAT   : c:\PS\northwind
    TABLE_SCHEM :
    TABLE_NAME  : Customers
    TABLE_TYPE  : TABLE
    REMARKS     :
    
  3. Utilize agora o Get-Item cmdlet para recuperar os itens na linha 0 da tabela de dados.

    Get-Item mydb:\customers\0
    

    Aparece a seguinte saída.

    PSPath        : AccessDB::customers\0
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : False
    Data          : System.Data.DataRow
    RowNumber     : 0
    
  4. Reutilizar Get-Item para recuperar os dados dos itens na linha 0.

    (Get-Item mydb:\customers\0).data
    

    Aparece a seguinte saída.

    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. Agora use o New-Item cmdlet para adicionar uma linha a uma mesa existente. O Path parâmetro especifica o caminho completo para a linha, e deve indicar um número de linha superior ao número de linhas existente na tabela. O Type parâmetro indica "linha" para especificar este tipo de item a adicionar. Finalmente, o Value parâmetro especifica uma lista delimitada por vírgula dos valores da coluna para a linha.

    New-Item -Path mydb:\Customers\3 -ItemType "row" -Value "3,CustomerFirstName,CustomerLastName,CustomerEmailAddress,CustomerTitle,CustomerCompany,CustomerPhone, CustomerAddress,CustomerCity,CustomerState,CustomerZip,CustomerCountry"
    
  6. Verifique a correção da operação do novo artigo da seguinte forma.

    PS mydb:\> cd Customers
    PS mydb:\Customers> (Get-Item 3).data
    

    Aparece a seguinte saída.

    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
    

Consulte também

Criação de fornecedores de Windows PowerShell

Designing Your Windows PowerShell Provider (Criar o seu Fornecedor do Windows PowerShell)

Implementação de um fornecedor de Windows PowerShell de artigos

Implementação de um Fornecedor de Windows PowerShell de Navegação

Como registar cmdlets, fornecedores e aplicações de anfitrião

Windows PowerShell SDK (SDK do Windows PowerShell)

Windows PowerShell Programmer's Guide (Guia do Programador do Windows PowerShell)