Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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*:
A sua implementação do método System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* não deve validar o caminho como um caminho legal e totalmente qualificado no namespace do fornecedor. Tenha em atenção que cada parâmetro só pode representar uma parte de um caminho, e as partes combinadas podem não gerar um caminho totalmente qualificado. Por exemplo, o método System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* para o fornecedor do Sistema de Ficheiros pode receber "windows\system32" no
parentparâmetro e "abc.dll" nochildparâmetro. O método liga estes valores ao separador "\" e devolve "windows\system32\abc.dll", que não é um caminho de sistema de ficheiros totalmente qualificado.Importante
As partes do caminho fornecidas na chamada para System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* podem conter caracteres não permitidos no namespace do fornecedor. Estes caracteres são muito provavelmente usados para expansão de wildcards e a implementação deste método não deve removê-los.
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.
Executa a tua nova shell e usa o
Set-Locationcmdlet para definir o caminho que indica a base de dados do Access.Set-Location mydb:Agora execute o
Get-ChildItemcmdlet 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 -AutoSizeRowCount 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 SuppliersUse novamente o
Set-Locationcmdlet para definir a localização da tabela de dados dos Colaboradores.Set-Location EmployeesVamos agora usar o
Get-Locationcmdlet para recuperar o caminho até à tabela Employees.Get-LocationPath ---- mydb:\EmployeesAgora usa o
Get-ChildItemcmdlet ligado aoFormat-Tablecmdlet. 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 peloFormat-Tablecmdlet.Get-ChildItem | Format-Table RowNumber, PSIsContainer, Data -AutoSizeRowNumber 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.DataRowAgora pode executar o
Get-Itemcmdlet para recuperar os itens da linha 0 da tabela de dados Employees.Get-Item 0PSPath : 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 : 0Use novamente o
Get-Itemcmdlet para recuperar os dados do funcionário dos itens na linha 0.(Get-Item 0).DataEmployeeID : 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