Partilhar via


Criação de um fornecedor de itens Windows PowerShell

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

Observação

Pode descarregar o ficheiro fonte C# (AccessDBSampleProvider03.cs) deste fornecedor 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, consulte Como Instalar o Windows PowerShell e Descarregar o Windows PowerShell SDK. Os ficheiros fonte descarregados estão disponíveis no PowerShell Samples diretório. Para mais informações sobre outras implementações de fornecedores Windows PowerShell, consulte Designing Your Windows PowerShell Provider.

O fornecedor de itens do Windows PowerShell descrito neste tópico obtém itens de dados de uma base de dados Access. Neste caso, um "item" é ou uma tabela na base de dados Access ou uma linha numa tabela.

Definição da classe de fornecedor de itens do Windows PowerShell

Um fornecedor de itens do Windows PowerShell 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 itens 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 amigável para o fornecedor utilizado pelo Windows PowerShell. O segundo parâmetro especifica as capacidades específicas do Windows PowerShell que o fornecedor expõe ao tempo de execução do Windows PowerShell durante o processamento de comandos. Para este fornecedor, não existem capacidades específicas do Windows PowerShell adicionais.

Definição da funcionalidade base

Conforme 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 fornecedores. Um fornecedor de itens do Windows PowerShell, portanto, deve definir toda a funcionalidade fornecida por essas classes.

Para mais informações sobre como implementar funcionalidades para adicionar informação de inicialização específica da sessão e para libertar recursos usados pelo fornecedor, consulte Criação de um Fornecedor Básico de PowerShell para Windows. No entanto, a maioria dos fornecedores, incluindo o fornecido aqui descrito, pode usar a implementação padrão desta funcionalidade fornecida pelo Windows PowerShell.

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

Verificação da validade do caminho

Ao procurar um dado, o runtime do Windows PowerShell fornece um caminho Windows PowerShell para o fornecedor, conforme definido na secção "Conceitos PSPath" de Como Funciona o Windows PowerShell. Um fornecedor de itens do Windows PowerShell deve verificar a validade sintática e semântica de qualquer caminho que lhe seja passado, implementando o método System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath . Este método retorna true se o caminho for válido, e false caso contrário. Tenha em atenção que a implementação deste método não deve verificar a existência do item no caminho, mas apenas que o caminho é sintaticamente e semanticamente 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 auxiliar NormalizePath para converter todos os separadores do 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 um item existe

Após verificar o caminho, o runtime do Windows PowerShell deve determinar se existe um dado nesse caminho. Para suportar este tipo de consulta, o fornecedor de itens do Windows PowerShell implementa o método System.Management.Automation.Provider.ItemCmdletProvider.ItemExists . Este método devolve true um item encontrado no caminho especificado e false (por defeito) caso contrário.

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 auxiliares PathIsDrive, ChunkPath e GetTable , e utiliza um objeto 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 do ItemExists

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

Anexação de parâmetros dinâmicos ao cmdlet de 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 em tempo de execução. Para fornecer estes parâmetros dinâmicos, o fornecedor de itens do Windows PowerShell 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 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 devolvido para adicionar os parâmetros ao Test-Path cmdlet.

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

Recuperar um item

Para recuperar um item, o fornecedor 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 este fornecedor. Note que este método utiliza os métodos GetTable e GetRow helper 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 de System.Management.Automation.Provider.ItemCmdletProvider.GetItem:

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

Por vezes, o Get-Item cmdlet requer parâmetros adicionais que são especificados dinamicamente em tempo de execução. Para fornecer estes parâmetros dinâmicos, o fornecedor de itens do Windows PowerShell 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 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 devolvido para adicionar os parâmetros ao Get-Item cmdlet.

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

Colocar um item

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

Este fornecedor não fornece uma substituição para o método System.Management.Automation.Provider.ItemCmdletProvider.SetItem . No entanto, segue-se 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 de System.Management.Automation.Provider.ItemCmdletProvider.SetItem:

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

Por vezes, o Set-Item cmdlet requer parâmetros adicionais que são especificados dinamicamente em tempo de execução. Para fornecer estes parâmetros dinâmicos, o fornecedor de itens do Windows PowerShell 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 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 devolvido para adicionar os parâmetros ao Set-Item cmdlet.

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

Limpar um item

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

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

Coisas a lembrar sobre a implementação do ClearItem

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

Recuperar parâmetros dinâmicos para o ClearItem

Por vezes, o Clear-Item cmdlet requer parâmetros adicionais que são especificados dinamicamente em tempo de execução. Para fornecer estes parâmetros dinâmicos, o fornecedor de itens do Windows PowerShell 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 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 devolvido para adicionar os parâmetros ao Clear-Item cmdlet.

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

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

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

Este fornecedor não implementa este método. No entanto, o código seguinte é 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 de System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction:

Recuperar parâmetros dinâmicos para o InvokeDefaultAction

Por vezes, o Invoke-Item cmdlet requer parâmetros adicionais que são especificados dinamicamente em tempo de execução. Para fornecer estes parâmetros dinâmicos, o fornecedor de itens do Windows PowerShell 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 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 devolvido para adicionar os parâmetros dinâmicos ao Invoke-Item cmdlet.

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

Implementação de métodos e classes auxiliares

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

Método NormalizePath

Este fornecedor de itens implementa um método auxiliar NormalizePath para garantir que o caminho tem um formato consistente. O formato especificado utiliza uma barra diagonal (\) como separador.

Método PathIsDrive

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

Método ChunkPath

Este fornecedor de itens implementa um método auxiliar ChunkPath que fragmenta o caminho especificado para que o fornecedor possa identificar os seus elementos individuais. Devolve um array composto pelos elementos do caminho.

Método GetTable

Este fornecedor de itens implementa o método helper GetTables que devolve um objeto DatabaseTableInfo que representa informação sobre a tabela especificada na chamada.

Método GetRow

O método System.Management.Automation.Provider.ItemCmdletProvider.GetItem deste fornecedor de itens chama o método helper GetRows . Este método helper recupera um objeto DatabaseRowInfo que representa informação sobre a linha especificada na tabela.

Classe DatabaseTableInfo

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

O fornecedor de itens de exemplo 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 try/catch para garantir que qualquer erro na base de dados aparece como uma linha com entradas zero.

Classe DatabaseRowInfo

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

O fornecedor de amostra define um método DatabaseRowInfo.GetRows para devolver uma coleção de objetos de informação de linha para a tabela especificada. Este método inclui um bloqueio try/catch para capturar exceções. Qualquer erro resultará na ausência de informação de linha.

Exemplo de código

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

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

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

Construir o fornecedor PowerShell do Windows

Veja Como Registar Cmdlets, Fornecedores e Aplicações Anfitriãs.

Testar o fornecedor PowerShell do Windows

Quando este fornecedor de itens do Windows PowerShell está registado no Windows PowerShell, só pode testar a funcionalidade básica e do disco do fornecedor. Para testar a manipulação de itens, deve também implementar funcionalidade de contentor descrita em Implementar um Fornecedor de PowerShell para Windows para Container.

Consulte também