Partilhar via


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

Este tópico descreve como criar um fornecedor de navegação Windows PowerShell que possa navegar pelo armazenamento de dados. Este tipo de fornecedor suporta comandos recursivos, containers aninhados e caminhos relativos.

Observação

Pode descarregar o ficheiro fonte C# (AccessDBSampleProvider05.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 <diretório PowerShell Samples> . Para mais informações sobre outras implementações de fornecedores Windows PowerShell, consulte Designing Your Windows PowerShell Provider.

O fornecedor aqui descrito permite ao utilizador gerir uma base de dados Access como um disco, para que o utilizador possa navegar até às tabelas de dados da base de dados. Ao criar o seu próprio fornecedor de navegação, pode implementar métodos que criem caminhos qualificados para o drive necessários para navegação, normalizar caminhos relativos, mover itens do armazenamento de dados, bem como métodos que obtenham nomes filhos, obtenham o caminho pai de um item e testem para identificar se um item é um contentor.

Atenção

Tenha em atenção que este design assume uma base de dados que tem um campo com o nome ID, e que o tipo do campo é LongInteger.

Defina o fornecedor Windows PowerShell

Um fornecedor de navegação Windows PowerShell deve criar uma classe .NET que derive da classe base System.Management.Automation.Provider.NavigationCmdletProvider . Aqui está a definição da classe para o fornecedor de navegação descrito nesta secção.

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

Note que, neste fornecedor, 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 são adicionadas capacidades específicas do PowerShell do Windows.

Definição da Funcionalidade Base

Como descrito em Design Your PS Provider, a classe base System.Management.Automation.Provider.NavigationCmdletProvider deriva de várias outras classes que forneciam diferentes funcionalidades de fornecedores. Um fornecedor de navegação Windows PowerShell, portanto, deve definir toda a funcionalidade fornecida por essas classes.

Para 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 PS. No entanto, a maioria dos fornecedores (incluindo o fornecedor descrito aqui) pode usar a implementação padrão desta funcionalidade fornecida pelo Windows PowerShell.

Para aceder ao armazenamento de dados através de uma unidade PowerShell do Windows, deve implementar os métodos da classe base System.Management.Automation.Provider.DriveCmdletProvider . Para mais informações sobre como implementar estes métodos, consulte Criar um Fornecedor de Unidades PowerShell para Windows.

Para manipular os itens de um armazenamento de dados, como obtenção, definição e compensação de itens, o fornecedor deve implementar os métodos fornecidos pela classe base System.Management.Automation.Provider.ItemCmdletProvider . Para mais informações sobre a implementação destes métodos, consulte Criação de um Fornecedor de Itens para Windows PowerShell.

Para aceder aos itens filhos, ou aos seus nomes, do armazenamento de dados, bem como aos métodos que criam, copiam, renomeiam e removem itens, deve implementar os métodos fornecidos pela classe base System.Management.Automation.Provider.ContainerCmdletProvider . Para mais informações sobre a implementação destes métodos, consulte Criar um Fornecedor de Contentores Windows PowerShell.

Criação de um Caminho PowerShell para Windows

O fornecedor de navegação Windows PowerShell utiliza um caminho interno do Windows PowerShell do fornecedor para navegar pelos itens do armazenamento de dados. Para criar um caminho interno ao fornecedor, o fornecedor deve implementar o método System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* para suportar chamadas do cmdlet Combine-Path. Este método combina um caminho pai e filho num caminho interno do fornecedor, usando um separador de caminho específico do fornecedor entre os caminhos pai e filho.

A implementação padrão toma caminhos com "/" ou "\" como separador de caminhos, normaliza o separador de caminho para "\", combina as partes do caminho pai e filho com o separador entre elas, e depois devolve uma string que contém os caminhos combinados.

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

Coisas a Lembrar Sobre a Implementação do MakePath

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

Recuperação do Caminho Parental

Os fornecedores de navegação Windows PowerShell implementam o método System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* para recuperar a parte mãe do caminho indicado, total ou parcial, específico do fornecedor. O método remove a parte filha do caminho e devolve a parte do caminho pai. O root parâmetro especifica o caminho totalmente qualificado até à raiz de uma unidade. Este parâmetro pode ser nulo ou vazio se uma unidade montada não estiver em uso para a operação de recuperação. Se uma raiz for especificada, o método deve devolver um caminho para um contentor na mesma árvore que a raiz.

O fornecedor de navegação de exemplo não sobrepõe este método, mas utiliza a implementação padrão. Aceita caminhos que usam tanto "/" como "\" como separadores de caminhos. Primeiro normaliza o caminho para ter apenas separadores "\", depois separa o caminho pai no último "\" e devolve o caminho pai.

Para Lembrar Sobre a Implementação do GetParentPath

A sua implementação do método System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* deve dividir o caminho lexicamente no separador de caminho para o namespace do fornecedor. Por exemplo, o fornecedor do Sistema de Ficheiros usa este método para procurar o último "\" e devolve tudo à esquerda do separador.

Recuperar o Nome do Caminho Filho

O seu fornecedor de navegação implementa o método System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* para recuperar o nome (elemento folha) do filho do item localizado no caminho específico indicado, total ou parcial.

O fornecedor de navegação de exemplo não sobrepõe este método. A implementação padrão é mostrada abaixo. Aceita caminhos que usam tanto "/" como "\" como separadores de caminhos. Primeiro normaliza o caminho para ter apenas separadores "\", depois divide o caminho pai no último "\" e devolve o nome da parte do caminho filho.

Coisas a Lembrar Sobre a Implementação do GetChildName

A sua implementação do método System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* deve dividir o caminho lexicamente no separador de caminho. Se o caminho fornecido não contiver separadores de caminho, o método deverá devolver o caminho sem modificações.

Importante

O caminho fornecido na chamada a este método pode conter caracteres que são ilegais no espaço de nomes do fornecedor. Estes caracteres são muito provavelmente usados para expansão de wildcards ou correspondência de expressões regulares, e a implementação deste método não deve removê-los.

Determinar se um Item é um Recipiente

O fornecedor de navegação pode implementar o método System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* para determinar se o caminho especificado indica um contentor. Retorna true se o caminho representar um contentor, e false caso contrário. O utilizador precisa deste método para poder usar o Test-Path cmdlet para o caminho fornecido.

O código seguinte mostra a implementação System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* no nosso fornecedor de navegação de exemplo. O método verifica se o caminho especificado está correto e se a tabela existe, e retorna verdadeiro se o caminho indicar um contentor.

protected override bool IsItemContainer(string path)
{
   if (PathIsDrive(path)) 
   { 
       return true; 
   }
   
   string[] pathChunks = ChunkPath(path);
   string tableName;
   int rowNumber;

   PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
   
   if (type == PathType.Table)
   {
      foreach (DatabaseTableInfo ti in GetTables())
      {
          if (string.Equals(ti.Name, tableName, StringComparison.OrdinalIgnoreCase))
          {
              return true;
          }
      } // foreach (DatabaseTableInfo...
   } // if (pathChunks...

   return false;
} // IsItemContainer

Coisas a Lembrar Sobre a Implementação do IsItemContainer

A sua classe .NET do fornecedor de navegação pode declarar capacidades do fornecedor ExpandWildcards, Filter, Include ou Exclude, da enumeração System.Management.Automation.Provider.ProviderCapabilities . Neste caso, a implementação do System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* precisa de garantir que o caminho passado cumpre os requisitos. Para isso, o método deve aceder à propriedade apropriada, por exemplo, a propriedade System.Management.Automation.Provider.CmdletProvider.Exclude* .

Mover um Item

Para suportar o Move-Item cmdlet, o seu fornecedor de navegação implementa o método System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* . Este método move o item especificado pelo path parâmetro para o contentor no caminho fornecido no destination parâmetro.

O fornecedor de navegação de exemplo não sobrepõe o método System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* . Segue-se a implementação padrão.

Coisas a Lembrar Sobre a Implementação do MoveItem

A sua classe .NET do fornecedor de navegação pode declarar capacidades do fornecedor ExpandWildcards, Filter, Include ou Exclude, da enumeração System.Management.Automation.Provider.ProviderCapabilities . Neste caso, a implementação do System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* deve garantir que o caminho passado cumpre os requisitos. Para isso, o método deve aceder à propriedade apropriada, por exemplo, o CmdletProvider.Exclude property.

Por defeito, as sobreposições deste método não devem mover objetos sobre objetos existentes, a menos que a propriedade System.Management.Automation.Provider.CmdletProvider.Force* esteja definida para true. Por exemplo, o fornecedor do Sistema de Ficheiros não copiará C:\temp\abc.txt sobre um ficheiro C:\bar.txt existente a menos que a propriedade System.Management.Automation.Provider.CmdletProvider.Force* esteja definida para true. Se o caminho especificado no destination parâmetro existir e for um contentor, a propriedade System.Management.Automation.Provider.CmdletProvider.Force* não é necessária. Neste caso, System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* deve mover o item indicado pelo path parâmetro para o contentor indicado pelo destination parâmetro como filho.

A sua implementação do método System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* deve chamar System.Management.Automation.Provider.CmdletProvider.ShouldProcess e verificar o seu valor de retorno antes de fazer quaisquer alterações ao armazenamento de dados. Este método é usado para confirmar a execução de uma operação quando é feita uma alteração no estado do sistema, por exemplo, eliminar ficheiros. System.Management.Automation.Provider.CmdletProvider.ShouldProcess envia o nome do recurso a ser alterado para o utilizador, com o runtime do Windows PowerShell a ter em conta quaisquer definições de linha de comandos ou variáveis de preferência para determinar o que deve ser apresentado ao utilizador.

Após a chamada para System.Management.Automation.Provider.CmdletProvider.ShouldProcess retorna true, o método System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* deve chamar o método System.Management.Automation.Provider.CmdletProvider.ShouldContinue . Este método envia uma mensagem ao utilizador para permitir feedback que indique se a operação deve continuar. O seu fornecedor deve ligar para System.Management.Automation.Provider.CmdletProvider.ShouldContinue como uma verificação adicional para modificações potencialmente perigosas do sistema.

Anexação de Parâmetros Dinâmicos ao Cmdlet Move-Item

Por vezes, o Move-Item cmdlet requer parâmetros adicionais que são fornecidos dinamicamente em tempo de execução. Para fornecer estes parâmetros dinâmicos, o fornecedor de navegação deve implementar o método System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters* para obter os valores de parâmetros necessários do item no caminho indicado, e devolver um objeto que tenha propriedades e campos com atributos de análise semelhantes a uma classe cmdlet ou a um objeto System.Management.Automation.RuntimeDefinedParameterDictionary .

Este fornecedor de navegação não implementa este método. No entanto, o código seguinte é a implementação padrão de System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters*.

Normalização de um Caminho Relativo

O seu fornecedor de navegação implementa o método System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* para normalizar o caminho totalmente qualificado indicado no path parâmetro como sendo relativo ao caminho especificado pelo basePath parâmetro. O método devolve uma representação de cadeia do caminho normalizado. Escreve um erro se o path parâmetro especificar um caminho inexistente.

O fornecedor de navegação de exemplo não sobrepõe este método. Segue-se a implementação padrão.

Coisas a Lembrar Sobre a Implementação do NormalizeRelativePath

A sua implementação de System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* deve analisar o path parâmetro, mas não tem de usar análise puramente sintática. É incentivado a desenhar este método para usar o caminho e procurar a informação do caminho no armazenamento de dados e criar um caminho que corresponda à sintaxe do envelope e do caminho padronizado.

Exemplo de código

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

Definição dos Tipos de Objetos e Formatação

É possível para um fornecedor adicionar membros a objetos existentes ou definir novos objetos. Para mais informações,veja Extensão dos Tipos de Objetos e Formatação.

Construir o fornecedor PowerShell do Windows

Para mais informações, consulte Como Registar Cmdlets, Fornecedores e Aplicações Anfitriãs.

Testar o fornecedor PowerShell do Windows

Quando o seu fornecedor Windows PowerShell estiver registado no Windows PowerShell, pode testá-lo executando os cmdlets suportados na linha de comandos, incluindo os cmdlets disponibilizados por derivação. Este exemplo irá testar o fornecedor de navegação por exemplo.

  1. Executa a tua nova shell e usa o Set-Location cmdlet para definir o caminho que indica a base de dados do Access.

    Set-Location mydb:
    
  2. Agora execute o Get-ChildItem cmdlet para recuperar uma lista dos itens da base de dados, que são as tabelas disponíveis na base de dados. Para cada tabela, este cmdlet também recupera o número de linhas da tabela.

    Get-ChildItem | Format-Table RowCount, Name -AutoSize
    
    RowCount   Name
    --------   ----
         180   MSysAccessObjects
           0   MSysACEs
           1   MSysCmdbars
           0   MSysIMEXColumns
           0   MSysIMEXSpecs
           0   MSysObjects
           0   MSysQueries
           7   MSysRelationships
           8   Categories
          91   Customers
           9   Employees
        2155   Order Details
         830   Orders
          77   Products
           3   Shippers
          29   Suppliers
    
  3. Use novamente o Set-Location cmdlet para definir a localização da tabela de dados dos Colaboradores.

    Set-Location Employees
    
  4. Vamos agora usar o Get-Location cmdlet para recuperar o caminho até à tabela Employees.

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. Agora usa o Get-ChildItem cmdlet ligado ao Format-Table cmdlet. Este conjunto de cmdlets recupera os itens para a tabela de dados Employees, que são as linhas da tabela. São formatados conforme especificado pelo Format-Table cmdlet.

    Get-ChildItem | Format-Table RowNumber, PSIsContainer, Data -AutoSize
    
    RowNumber   PSIsContainer   Data
    ---------   --------------   ----
    0           False            System.Data.DataRow
    1           False            System.Data.DataRow
    2           False            System.Data.DataRow
    3           False            System.Data.DataRow
    4           False            System.Data.DataRow
    5           False            System.Data.DataRow
    6           False            System.Data.DataRow
    7           False            System.Data.DataRow
    8           False            System.Data.DataRow
    
  6. Agora pode executar o Get-Item cmdlet para recuperar os itens da linha 0 da tabela de dados Employees.

    Get-Item 0
    
    PSPath        : AccessDB::C:\PS\Northwind.mdb\Employees\0
    PSParentPath  : AccessDB::C:\PS\Northwind.mdb\Employees
    PSChildName   : 0
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : False
    Data           : System.Data.DataRow
    RowNumber      : 0
    
  7. Use novamente o Get-Item cmdlet para recuperar os dados do funcionário dos itens na linha 0.

    (Get-Item 0).Data
    
    EmployeeID      : 1
    LastName        : Davis
    FirstName       : Sara
    Title           : Sales Representative
    TitleOfCourtesy : Ms.
    BirthDate       : 12/8/1968 12:00:00 AM
    HireDate        : 5/1/1992 12:00:00 AM
    Address         : 4567 Main Street
                      Apt. 2A
    City            : Buffalo
    Region          : NY
    PostalCode      : 98052
    Country         : USA
    HomePhone       : (206) 555-9857
    Extension       : 5467
    Photo           : EmpID1.bmp
    Notes           : Education includes a BA in psychology from
                      Colorado State University. She also completed "The
                      Art of the Cold Call."  Nancy is a member of
                      Toastmasters International.
    ReportsTo       : 2
    

Ver também

Criação de fornecedores PowerShell para Windows

Projete o seu fornecedor PowerShell para Windows

Extensão dos Tipos de Objetos e Formatação

Implementar um fornecedor de PowerShell para Windows em Container

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

Guia do Programador do Windows PowerShell

Windows PowerShell SDK