Criar um fornecedor de artigos Windows PowerShell

Este tópico descreve como criar um fornecedor Windows PowerShell que possa manipular os dados numa loja de dados. Neste tópico, os elementos de dados na loja são referidos como os "itens" da loja de dados. Como consequência, um fornecedor que possa manipular os dados na loja é referido como um fornecedor de artigos Windows PowerShell.

Nota

Pode descarregar o ficheiro de origem C# (AccessDBSampleProvider03.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 fornecedor de Windows PowerShell de artigos descrito neste tópico obtém itens de dados a partir de uma base de dados do Access. Neste caso, um "item" é uma tabela na base de dados Access ou uma linha numa tabela.

Definição da classe de fornecedor de artigos Windows PowerShell

Um fornecedor de Windows PowerShell de artigos deve definir uma classe .NET que deriva da classe base System.Management.Automation.Provider.ItemCmdletProvider. Segue-se a definição de classe para o fornecedor de artigos descrito nesta secção.

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

public class AccessDBProvider : ItemCmdletProvider

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 Windows PowerShell específicas.

Definição da funcionalidade base

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

Para obter mais informações sobre como implementar a funcionalidade de adição de informações de inicialização específicas da sessão e para libertar 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.

Antes que o fornecedor de artigos Windows PowerShell possa manipular os itens na loja, deve implementar os métodos da classe base System.Management.Automation.Provider.DriveCmdletProvider para aceder à loja de dados. Para obter mais informações sobre a implementação desta classe, consulte criar um Fornecedor de Unidade Windows PowerShell.

Verificação da validade do caminho

Ao procurar um item de dados, o tempo de execução Windows PowerShell fornece um caminho Windows PowerShell para o fornecedor, conforme definido na secção "CONCEITOS PSPath" de Como funciona Windows PowerShell. Um fornecedor de Windows PowerShell de artigos deve verificar a validade sintática e semântica de qualquer caminho que lhe tenha sido passado através da implementação do método System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath. Este método retorna true se o caminho for válido, e false de outra forma. Esteja ciente de que a implementação deste método não deve verificar a existência do item no caminho, mas apenas que o caminho é sinticamente e semântica correto.

Aqui está a implementação do método System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath para este fornecedor. Note que esta implementação chama um método de ajuda NormalizePath para converter todos os separadores no caminho para um uniforme.

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

Determinar se existe um item

Após a verificação do caminho, o tempo de execução Windows PowerShell deve determinar se existe um item de dados nesse caminho. Para suportar este tipo de consulta, o fornecedor de Windows PowerShell de artigo implementa o método System.Management.Automation.Provider.ItemCmdletProvider.ItemExists. Este método devolve true um item encontra-se no caminho especificado e false (padrão) de outra forma.

Aqui está a implementação do método System.Management.Automation.Provider.ItemCmdletProvider.ItemExists para este fornecedor. Note que este método chama os métodos de ajuda PathIsDrive, ChunkPath e GetTable , e utiliza um objeto de DatabaseTableInfo definido pelo fornecedor.

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

Coisas a lembrar sobre a implementação de ItemExists

As seguintes condições podem aplicar-se à sua implementação de System.Management.Automation.Provider.ItemCmdletProvider.ItemExists:

Fixação de parâmetros dinâmicos ao cmdlet Test-Path

Por vezes, o Test-Path cmdlet que chama System.Management.Automation.Provider.ItemCmdletProvider.ItemExists requer parâmetros adicionais que são especificados dinamicamente no tempo de execução. Para fornecer estes parâmetros dinâmicos, o fornecedor de Windows PowerShell item deve implementar o método System.Management.Automation.Provider.ItemCmdletProvider.ItemExistsDynamicParameters. 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.RuntimeDefinedParameterDictionary . O tempo de execução Windows PowerShell utiliza o objeto devolvido para adicionar os parâmetros ao Test-Path cmdlet.

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

Recuperação de um item

Para recuperar um item, o fornecedor de Windows PowerShell de artigos deve substituir o sistema.Management.Automation.Provider.ItemCmdletProvider.GetItem para suportar chamadas a Get-Item partir do cmdlet. Este método escreve o item utilizando o método System.Management.Automation.Provider.CmdletProvider.WriteItemObject .

Aqui está a implementação do método System.Management.Automation.Provider.ItemCmdletProvider.GetItem para este fornecedor. Note que este método utiliza os métodos de ajuda GetTable e GetRow para recuperar itens que são tabelas na base de dados Access ou linhas numa tabela de dados.

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

Coisas a lembrar sobre a implementação do GetItem

As seguintes condições podem aplicar-se a uma implementação do System.Management.Automation.Provider.ItemCmdletProvider.GetItem:

Fixação de parâmetros dinâmicos ao cmdlet Get-Item

Por vezes, o Get-Item 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 Windows PowerShell de artigos deve implementar o método System.Management.Automation.Provider.ItemCmdletProvider.GetItemDynamicParameters. 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.RuntimeDefinedParameterDictionary . O tempo de execução Windows PowerShell utiliza o objeto devolvido para adicionar os parâmetros ao Get-Item cmdlet.

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

Definição de um item

Para definir um item, o fornecedor de Windows PowerShell de artigos deve sobrepor-se ao método System.Management.Automation.Provider.ItemCmdletProvider.SetItem para suportar chamadas a Set-Item partir do cmdlet. Este método define o valor do item no caminho especificado.

Este fornecedor não fornece uma sobreposição para o método System.Management.Automation.Provider.ItemCmdletProvider.SetItem . No entanto, o seguinte é a implementação padrão deste método.

Coisas a lembrar sobre a implementação do SetItem

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

Recuperação de parâmetros dinâmicos para SetItem

Por vezes, o Set-Item 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 Windows PowerShell de artigos deve implementar o método System.Management.Automation.Provider.ItemCmdletProvider.SetItemDynamicParameters. 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.RuntimeDefinedParameterDictionary . O tempo de execução Windows PowerShell utiliza o objeto devolvido para adicionar os parâmetros ao Set-Item cmdlet.

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

Limpar um item

Para limpar um item, o fornecedor de Windows PowerShell de artigo implementa o método System.Management.Automation.Provider.ItemCmdletProvider.ClearItem para suportar chamadas a Clear-Item partir do cmdlet. Este método apaga o item de dados no caminho especificado.

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

Coisas a lembrar sobre a implementação da ClearItem

As seguintes condições podem aplicar-se a uma implementação do System.Management.Automation.Provider.ItemCmdletProvider.ClearItem:

Recupere os parâmetros dinâmicos para a ClearItem

Por vezes, o Clear-Item 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 Windows PowerShell item deve implementar o método System.Management.Automation.Provider.ItemCmdletProvider.ClearItemDynamicParameters. 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.RuntimeDefinedParameterDictionary . O tempo de execução Windows PowerShell utiliza o objeto devolvido para adicionar os parâmetros ao Clear-Item cmdlet.

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

Realização de uma ação padrão para um item

Um fornecedor de Windows PowerShell de artigos pode implementar o método System.Management.Automation.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction para suportar chamadas a partir do Invoke-Item cmdlet, que permite ao fornecedor realizar uma ação padrão para o item na trajetória especificada. Por exemplo, o fornecedor do FileSystem pode usar este método para ligar para a ShellExecute para um item específico.

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

Coisas a lembrar sobre a implementação do InvokeDefaultAction

As seguintes condições podem aplicar-se a uma implementação do System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction:

Recupere os parâmetros dinâmicos para InvokeDefaultAction

Por vezes, o Invoke-Item 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 Windows PowerShell de artigos deve implementar o método System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultActionDynamicParameters. 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.RuntimeDefinedParameterDictionary . O tempo de execução Windows PowerShell utiliza o objeto devolvido para adicionar os parâmetros dinâmicos ao Invoke-Item cmdlet.

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

Implementação de métodos e classes de ajudantes

Este fornecedor de artigos implementa vários métodos e classes de ajuda que são utilizados pelo público sobrepõe-se a métodos definidos por Windows PowerShell. O código para estes métodos e classes de ajudantes é indicado na secção Amostra de Código .

Método Normalizara

Este fornecedor de item implementa um método de ajuda NormalizePath para garantir que o caminho tem um formato consistente. O formato especificado utiliza uma contrala detrás (\) como separador.

Método PathIsDrive

Este fornecedor de item implementa um método de ajuda PathIsDrive para determinar se o caminho especificado é realmente o nome de unidade.

Método ChunkPath

Este fornecedor de item implementa um método de ajuda chunkPath que rompe o caminho especificado para que o fornecedor possa identificar os seus elementos individuais. Devolve uma matriz composta pelos elementos do caminho.

Método GetTable

Este fornecedor de item implementa o método de ajuda GetTables que devolve um objeto DatabaseTableInfo que representa informações sobre a tabela especificada na chamada.

Método GetRow

O método System.Management.Automation.Provider.ItemCmdletProvider.GetItem deste fornecedor de artigos chama o método do ajudante GetRows . Este método de ajuda recupera um objeto DatabaseRowInfo que representa informações sobre a linha especificada na tabela.

Classe DatabaseTableInfo

Este fornecedor de item define uma classe DatabaseTableInfo que representa uma recolha de informação numa tabela de dados na base de dados. Esta aula é semelhante à classe System.IO.Directoryinfo .

O fornecedor de produto de amostra define um método DatabaseTableInfo.GetTables que devolve uma coleção de objetos de informação de tabela que definem as tabelas na base de dados. Este método inclui um bloco de tentativa/captura para garantir que qualquer erro de base de dados apareça como uma linha com zero entradas.

Classe DatabaseRowInfo

Este fornecedor de item define a classe de ajudante DatabaseRowInfo que representa uma linha numa tabela da base de dados. Esta classe é semelhante à classe System.IO.FileInfo .

O fornecedor de amostras define um método DatabaseRowInfo.GetRows para devolver uma recolha de objetos de informação de linha para a tabela especificada. Este método inclui um bloco de tentativa/captura para capturar exceções. Quaisquer erros não resultarão em nenhuma informação de linha.

Exemplo de código

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

Definição de tipos de objetos e formatação

Ao escrever um fornecedor, pode ser necessário adicionar membros aos objetos existentes ou definir novos objetos. Quando terminar, crie um ficheiro Types que Windows PowerShell possa utilizar para identificar os membros do objeto e um ficheiro formato que define como o objeto é apresentado. Para obter mais informações, consulte Os Tipos de Objetos Extensão e Formatação.

Construção do provedor de Windows PowerShell

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

Testar o fornecedor de Windows PowerShell

Quando este fornecedor de Windows PowerShell de artigos está registado com Windows PowerShell, só pode testar a funcionalidade básica e de unidade do fornecedor. Para testar a manipulação de itens, deve também implementar a funcionalidade do recipiente descrita na Implementação de um Fornecedor de Windows PowerShell de Contentores.

Ver também