Compartilhar via


Criando um provedor de itens para Windows PowerShell

Este tópico descreve como criar um provedor Windows PowerShell que possa manipular os dados em um armazenamento de dados. Neste tópico, os elementos de dados na loja são chamados de "itens" do armazenamento de dados. Como consequência, um provedor que pode manipular os dados na loja é chamado de provedor de itens do Windows PowerShell.

Observação

Você pode baixar o arquivo-fonte em C# (AccessDBSampleProvider03.cs) deste provedor usando o Microsoft Windows Software Development Kit para Windows Vista e os Componentes de Runtime do .NET Framework 3.0. Para instruções de download, veja Como Instalar o Windows PowerShell e Baixar o Windows PowerShell SDK. Os arquivos fonte baixados estão disponíveis no PowerShell Samples diretório. Para mais informações sobre outras implementações de provedores Windows PowerShell, veja Designing Your Windows PowerShell Provider.

O provedor de itens do Windows PowerShell descrito neste tópico obtém itens de dados de um banco de dados Access. Nesse caso, um "item" é ou uma tabela no banco de dados Access ou uma linha em uma tabela.

Definindo a classe provedor de itens do Windows PowerShell

Um provedor de itens do Windows PowerShell deve definir uma classe .NET que derive da classe base System.Management.Automation.Provider.ItemCmdletProvider . A seguir está a definição de classe para o provedor de itens descrito nesta seçã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 amigável para o provedor usado pelo Windows PowerShell. O segundo parâmetro especifica as capacidades específicas do Windows PowerShell que o provedor expõe ao tempo de execução do Windows PowerShell durante o processamento de comandos. Para este provedor, não há recursos adicionais específicos do PowerShell do Windows.

Definindo a funcionalidade base

Como descrito em Design Your Windows PowerShell Provider, a classe System.Management.Automation.Provider.DriveCmdletProvider deriva de várias outras classes que forneciam funcionalidades diferentes de provedores. Portanto, um provedor de itens do Windows PowerShell deve definir toda a funcionalidade fornecida por essas classes.

Para mais informações sobre como implementar funcionalidades para adicionar informações específicas de inicialização de sessão e para liberar recursos usados pelo provedor, veja Criando um Provedor Básico de PowerShell para Windows. No entanto, a maioria dos provedores, incluindo o fornecido aqui, pode usar a implementação padrão dessa funcionalidade fornecida pelo Windows PowerShell.

Antes que o provedor de itens do Windows PowerShell possa manipular os itens na loja, ele deve implementar os métodos da classe base System.Management.Automation.Provider.DriveCmdletProvider para acessar o armazenamento de dados. Para mais informações sobre como implementar essa classe, veja Criando um Provedor de Unidades Windows PowerShell.

Verificação da validade do caminho

Ao buscar um dado, o runtime do Windows PowerShell fornece um caminho do Windows PowerShell para o provedor, conforme definido na seção "Conceitos PSPath" de Como o Windows PowerShell Funciona. Um provedor de itens do Windows PowerShell deve verificar a validade sintática e semântica de qualquer caminho passado a ele implementando o método System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath . Esse método retorna true se o caminho for válido, e false caso contrário. Esteja ciente de que a implementação desse método não deve verificar a existência do item no caminho, mas apenas que o caminho está sintaticamente e semanticamente correto.

Aqui está a implementação do método System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath para este provedor. Note que essa implementação chama um método auxiliar NormalizePath para converter todos os separadores no caminho em 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 um item existe

Após verificar o caminho, o tempo de execução do Windows PowerShell deve determinar se existe um dado nesse caminho. Para suportar esse tipo de consulta, o provedor de itens do Windows PowerShell implementa o método System.Management.Automation.Provider.ItemCmdletProvider.ItemExists . Esse método retorna true um item encontrado no caminho especificado e false (padrão) caso contrário.

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

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 para lembrar sobre implementar o ItemExists

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

Anexando parâmetros dinâmicos ao cmdlet de Test-Path

Às vezes, o Test-Path cmdlet que chama System.Management.Automation.Provider.ItemCmdletProvider.ItemExists requer parâmetros adicionais que são especificados dinamicamente em tempo de execução. Para fornecer esses parâmetros dinâmicos, o provedor de itens do Windows PowerShell deve implementar o método System.Management.Automation.Provider.ItemCmdletProvider.ItemExistsDynamicParameters . Esse método recupera os parâmetros dinâmicos do item no caminho indicado e retorna um objeto que possui propriedades e campos com atributos de análise semelhantes a uma classe cmdlet ou a um objeto System.Management.Automation.RuntimeDefinedParameterDictionary . O runtime do Windows PowerShell usa o objeto retornado para adicionar os parâmetros ao Test-Path cmdlet.

Este provedor de itens do Windows PowerShell não implementa esse método. No entanto, o código a seguir é a implementação padrão desse método.

Recuperando um item

Para recuperar um item, o provedor de itens do Windows PowerShell deve sobrescrever o método System.Management.Automation.Provider.ItemCmdletProvider.GetItem para suportar chamadas do Get-Item cmdlet. Este método escreve o item usando o método System.Management.Automation.Provider.CmdletProvider.WriteItemObject .

Aqui está a implementação do método System.Management.Automation.Provider.ItemCmdletProvider.GetItem para esse provedor. Note que esse método usa os métodos auxiliares GetTable e GetRow para recuperar itens que são tabelas no banco de dados Access ou linhas em uma 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 para lembrar sobre implementar o GetItem

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

Anexando parâmetros dinâmicos ao cmdlet de Get-Item

Às vezes, o Get-Item cmdlet requer parâmetros adicionais que são especificados dinamicamente em tempo de execução. Para fornecer esses parâmetros dinâmicos, o fornecedor de itens do Windows PowerShell deve implementar o método System.Management.Automation.Provider.ItemCmdletProvider.GetItemDynamicParameters . Esse método recupera os parâmetros dinâmicos do item no caminho indicado e retorna um objeto que possui propriedades e campos com atributos de análise semelhantes a uma classe cmdlet ou a um objeto System.Management.Automation.RuntimeDefinedParameterDictionary . O runtime do Windows PowerShell usa o objeto retornado para adicionar os parâmetros ao Get-Item cmdlet.

Este provedor não implementa esse método. No entanto, o código a seguir é a implementação padrão desse método.

Configuração de um item

Para definir um item, o provedor de itens do Windows PowerShell deve sobrescrever o método System.Management.Automation.Provider.ItemCmdletProvider.SetItem para suportar chamadas do Set-Item cmdlet. Esse método define o valor do item no caminho especificado.

Este provedor não fornece uma substituição para o método System.Management.Automation.Provider.ItemCmdletProvider.SetItem . No entanto, a seguir está a implementação padrão desse método.

Coisas para lembrar sobre implementar o SetItem

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

Recuperando parâmetros dinâmicos para o SetItem

Às vezes, o Set-Item cmdlet requer parâmetros adicionais que são especificados dinamicamente em tempo de execução. Para fornecer esses parâmetros dinâmicos, o provedor de itens do Windows PowerShell deve implementar o método System.Management.Automation.Provider.ItemCmdletProvider.SetItemDynamicParameters . Esse método recupera os parâmetros dinâmicos do item no caminho indicado e retorna um objeto que possui propriedades e campos com atributos de análise semelhantes a uma classe cmdlet ou a um objeto System.Management.Automation.RuntimeDefinedParameterDictionary . O runtime do Windows PowerShell usa o objeto retornado para adicionar os parâmetros ao Set-Item cmdlet.

Este provedor não implementa esse método. No entanto, o código a seguir é a implementação padrão desse método.

Liberando um item

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

Este provedor não implementa esse método. No entanto, o código a seguir é a implementação padrão desse método.

Coisas para lembrar sobre implementar o ClearItem

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

Recuperar parâmetros dinâmicos para o ClearItem

Às vezes, o Clear-Item cmdlet requer parâmetros adicionais que são especificados dinamicamente em tempo de execução. Para fornecer esses parâmetros dinâmicos, o fornecedor de itens do Windows PowerShell deve implementar o método System.Management.Automation.Provider.ItemCmdletProvider.ClearItemDynamicParameters . Esse método recupera os parâmetros dinâmicos do item no caminho indicado e retorna um objeto que possui propriedades e campos com atributos de análise semelhantes a uma classe cmdlet ou a um objeto System.Management.Automation.RuntimeDefinedParameterDictionary . O runtime do Windows PowerShell usa o objeto retornado para adicionar os parâmetros ao Clear-Item cmdlet.

Este fornecedor de itens não implementa esse método. No entanto, o código a seguir é a implementação padrão desse método.

Realizando uma ação padrão para um item

Um provedor de itens do Windows PowerShell pode implementar o método System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction para suportar chamadas do Invoke-Item cmdlet, o que permite ao provedor executar uma ação padrão para o item no caminho especificado. Por exemplo, o provedor do Sistema de Arquivos pode usar esse método para chamar o ShellExecute para um item específico.

Este provedor não implementa esse método. No entanto, o código a seguir é a implementação padrão desse método.

Coisas para lembrar sobre implementar o InvokeDefaultAction

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

Recuperar parâmetros dinâmicos para InvokeDefaultAction

Às vezes, o Invoke-Item cmdlet requer parâmetros adicionais que são especificados dinamicamente em tempo de execução. Para fornecer esses parâmetros dinâmicos, o fornecedor de itens do Windows PowerShell deve implementar o método System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultActionDynamicParameters . Esse método recupera os parâmetros dinâmicos do item no caminho indicado e retorna um objeto que possui propriedades e campos com atributos de análise semelhantes a uma classe cmdlet ou a um objeto System.Management.Automation.RuntimeDefinedParameterDictionary . O runtime do Windows PowerShell usa o objeto retornado para adicionar os parâmetros dinâmicos ao Invoke-Item cmdlet.

Este fornecedor de itens não implementa esse método. No entanto, o código a seguir é a implementação padrão desse método.

Implementação de métodos e classes auxiliares

Esse provedor de itens implementa vários métodos e classes auxiliares que são usados pelos métodos públicos de override definidos pelo Windows PowerShell. O código desses métodos e classes auxiliares é mostrado na seção de Exemplo de Código .

Método NormalizePath

Esse provedor de itens implementa um método auxiliar NormalizePath para garantir que o caminho tenha um formato consistente. O formato especificado usa uma barra adicional (\) como separador.

Método PathIsDrive

Esse provedor de itens implementa um método auxiliar PathIsDrive para determinar se o caminho especificado é realmente o nome da unidade.

Método ChunkPath

Esse provedor de itens implementa um método auxiliar ChunkPath que separa o caminho especificado para que o provedor possa identificar seus elementos individuais. Ele retorna um array composto pelos elementos do caminho.

Método GetTable

Esse provedor de itens implementa o método helper GetTables que retorna 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 provedor de itens chama o método helper GetRows . Esse método auxiliar recupera um objeto DatabaseRowInfo que representa informações sobre a linha especificada na tabela.

Classe DatabaseTableInfo

Este provedor de itens define uma classe DatabaseTableInfo que representa uma coleção de informações em uma tabela de dados no banco de dados. Esta classe é semelhante à classe System.IO.Directoryinfo .

O provedor de itens de exemplo define um método DatabaseTableInfo.GetTables que retorna uma coleção de objetos de informação de tabela que definem as tabelas do banco de dados. Esse método inclui um bloco try/catch para garantir que qualquer erro de banco de dados apareça como uma linha com zero entradas.

Classe DatabaseRowInfo

Esse provedor de itens define a classe auxiliar DatabaseRowInfo que representa uma linha em uma tabela do banco de dados. Esta classe é semelhante à classe System.IO.FileInfo .

O provedor de amostra define um método DatabaseRowInfo.GetRows para retornar uma coleção de objetos de informação de linha para a tabela especificada. Esse método inclui um bloqueio try/catch para capturar exceções. Qualquer erro resultará em nenhuma informação de linha.

Exemplo de código

Para um código de exemplo completo, veja AccessDbProviderSample03 Code Sample.

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

Ao escrever um provedor, pode ser necessário adicionar membros a objetos existentes ou definir novos objetos. Quando terminar, crie um arquivo Types que o PowerShell do Windows possa usar para identificar os membros do objeto e um arquivo Format que defina como o objeto é exibido. Para mais informações, veja Estendendo Tipos de Objeto e Formatação.

Construindo o provedor Windows PowerShell

Veja como registrar cmdlets, provedores e aplicações host.

Testando o provedor PowerShell do Windows

Quando esse provedor de itens do Windows PowerShell está registrado no Windows PowerShell, você só pode testar a funcionalidade básica e do disco do provedor. Para testar a manipulação dos itens, você também deve implementar funcionalidades de contêineres descritas em Implementando um Provedor de PowerShell para Windows para Container.

Consulte também