Creating a Windows PowerShell Container Provider (Criar um Fornecedor de Contentores do Windows PowerShell)
Este tópico descreve como criar um fornecedor Windows PowerShell que possa trabalhar em lojas de dados de várias camadas. Para este tipo de armazenamento de dados, o nível superior da loja contém os itens de raiz e cada nível subsequente é referido como um nó de itens infantis. Ao permitir que o utilizador trabalhe nestes nós infantis, um utilizador pode interagir hierárquicamente através da loja de dados.
Os fornecedores que podem trabalhar em lojas de dados de vários níveis são referidos como fornecedores de contentores Windows PowerShell. No entanto, tenha em atenção que um fornecedor de recipientes Windows PowerShell só pode ser utilizado quando existe um recipiente (sem contentores aninhados) com objetos nele. Se existirem recipientes aninhados, deve implementar um fornecedor de navegação Windows PowerShell. Para obter mais informações sobre a implementação Windows PowerShell fornecedor de navegação, consulte criar um Fornecedor de Navegação Windows PowerShell.
Nota
Pode descarregar o ficheiro de origem C# (AccessDBSampleProvider04.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 Windows PowerShell fornecedor de contentores aqui descrito define a base de dados como o seu único contentor, com as tabelas e linhas da base de dados definidas como itens do contentor.
Atenção
Esteja ciente de que este design assume uma base de dados que tem um campo com o nome ID, e que o tipo de campo é LongInteger.
Definição de uma classe de fornecedor de recipientes Windows PowerShell
Um fornecedor de contentores Windows PowerShell deve definir uma classe .NET que deriva da classe base System.Management.Automation.Provider.Containercmdletprovider. Aqui está a definição de classe para o fornecedor de contentores Windows PowerShell descrito nesta secção.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ContainerCmdletProvider
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 específicas Windows PowerShell que sejam adicionadas.
Definição da funcionalidade base
Conforme descrito no Designing Your Windows PowerShell Provider, a classe System.Management.Automation.Provider.Containercmdletprovider deriva de várias outras classes que forneceram diferentes funcionalidades do fornecedor. Um fornecedor de contentores Windows PowerShell precisa, portanto, de definir todas as funcionalidades fornecidas por essas classes.
Para implementar a funcionalidade de adição de informações de inicialização específicas da sessão e para a libertação de 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.
Para ter acesso à loja de dados, o fornecedor deve implementar os métodos da classe base System.Management.Automation.Provider.Drivecmdletprovider. Para obter mais informações sobre a implementação destes métodos, consulte criar um fornecedor de unidade Windows PowerShell.
Para manipular os itens de uma loja de dados, tais como obter, configurar e limpar itens, o fornecedor deve implementar os métodos fornecidos pela classe base System.Management.Automation.Provider.Itemcmdletprovider base class. Para obter mais informações sobre a implementação destes métodos, consulte criar um fornecedor de artigos Windows PowerShell.
Recuperação de itens para crianças
Para recuperar um item para crianças, o fornecedor de recipientes Windows PowerShell deve sobrepor-se ao método System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* para suportar as chamadas do Get-ChildItem
cmdlet. Este método recupera objetos infantis da loja de dados e escreve-os para o oleoduto como objetos. Se o recurse
parâmetro do cmdlet for especificado, o método recupera todas as crianças independentemente do nível em que estejam. Se o recurse
parâmetro não for especificado, o método recupera apenas um único nível de crianças.
Eis a implementação do método System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* para este fornecedor. Note que este método recupera os itens da criança em todas as tabelas de bases de dados quando o caminho indica a base de dados Access e recupera os itens da criança das linhas dessa tabela se o caminho indicar uma tabela de dados.
protected override void GetChildItems(string path, bool recurse)
{
// If path represented is a drive then the children in the path are
// tables. Hence all tables in the drive represented will have to be
// returned
if (PathIsDrive(path))
{
foreach (DatabaseTableInfo table in GetTables())
{
WriteItemObject(table, path, true);
// if the specified item exists and recurse has been set then
// all child items within it have to be obtained as well
if (ItemExists(path) && recurse)
{
GetChildItems(path + pathSeparator + table.Name, recurse);
}
} // foreach (DatabaseTableInfo...
} // if (PathIsDrive...
else
{
// Get the table name, row number and type of path from the
// path specified
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
// Obtain all the rows within the table
foreach (DatabaseRowInfo row in GetRows(tableName))
{
WriteItemObject(row, path + pathSeparator + row.RowNumber,
false);
} // foreach (DatabaseRowInfo...
}
else if (type == PathType.Row)
{
// In this case the user has directly specified a row, hence
// just give that particular row
DatabaseRowInfo row = GetRow(tableName, rowNumber);
WriteItemObject(row, path + pathSeparator + row.RowNumber,
false);
}
else
{
// In this case, the path specified is not valid
ThrowTerminatingInvalidPathException(path);
}
} // else
} // GetChildItems
Coisas a lembrar sobre implementar GetChildItems
As seguintes condições podem aplicar-se à sua implementação do System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*
Ao definir a classe de fornecedor, um fornecedor de contentores Windows PowerShell poderá declarar as capacidades do fornecedor de expandWildcards, Filter, Include ou Exclude, da enumeração System.Management.Automation.Provider.Providercapabilities. Nestes casos, a implementação do método System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* deve garantir que o caminho passado para o método satisfaz os requisitos das capacidades especificadas. Para tal, o método deve aceder à propriedade adequada, por exemplo, às propriedades System.Management.Automation.Automation.Provider.Cmdletprovider.Exclude* e System.Management.Automation.Provider.Cmdletprovider.Include* propriedades.
A implementação deste método deve ter em conta qualquer forma de acesso ao item que possa tornar o artigo visível para o utilizador. Por exemplo, se um utilizador tiver acesso a um ficheiro através do fornecedor FileSystem (fornecido por Windows PowerShell), mas não ler o acesso, o ficheiro ainda existe e system.Management.Automation.Provider.Itemcmdletprovider.Itemexists*
true
devolve. A sua implementação pode exigir a verificação de um item dos pais para ver se a criança pode ser enumerada.Ao escrever vários itens, o método System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* pode demorar algum tempo. Pode conceber o seu fornecedor para escrever os itens utilizando o método System.Management.Automation.Provider.Cmdletprovider.Writeitemobject* um de cada vez. A utilização desta técnica apresentará os itens ao utilizador num fluxo.
A sua implementação de System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* é responsável por prevenir a recursão infinita quando existem ligações circulares, e similares. Deve ser lançada uma exceção adequada para refletir tal condição.
Anexação de parâmetros dinâmicos ao Get-ChildItem Cmdlet
Por Get-ChildItem
vezes, o cmdlet que chama System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* requer parâmetros adicionais que são especificados dinamicamente no tempo de execução. Para fornecer estes parâmetros dinâmicos, o fornecedor de contentores Windows PowerShell deve implementar o método System.Management.Automation.Provider.Containercmdletprovider.Getchilditemsdynamicparameters*. Este método recupera parâmetros dinâmicos para o item no caminho indicado e devolve um objeto que tem propriedades e campos com atributos de parsing semelhantes a uma classe cmdlet ou um dispositivo System.Management.Automation.Runtimedefinedparametrtionary object. O tempo de execução Windows PowerShell utiliza o objeto devolvido para adicionar os parâmetros ao Get-ChildItem
cmdlet.
Este Windows PowerShell fornecedor de contentores não implementa este método. No entanto, o seguinte código é a implementação padrão deste método.
Recuperação de nomes de artigos para crianças
Para recuperar os nomes dos artigos para crianças, o fornecedor de recipientes Windows PowerShell deve sobrepor-se ao método System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* para suportar chamadas do Get-ChildItem
cmdlet quando o seu parâmetro for Name
especificado. Este método recupera os nomes dos itens da criança para o caminho especificado ou nomes de objetos infantis para todos os recipientes se o returnAllContainers
parâmetro do cmdlet for especificado. Um nome de criança é a parte da folha de um caminho. Por exemplo, o nome da criança para o caminho c:\windows\system32\abc.dll é "abc.dll". O nome da criança para o diretório c:\windows\system32 é "system32".
Eis a implementação do método System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* para este fornecedor. Note que o método recupera nomes de tabelas se o caminho especificado indicar a base de dados de Acesso (unidade) e os números de linha se o caminho indicar uma tabela.
protected override void GetChildNames(string path,
ReturnContainers returnContainers)
{
// If the path represented is a drive, then the child items are
// tables. get the names of all the tables in the drive.
if (PathIsDrive(path))
{
foreach (DatabaseTableInfo table in GetTables())
{
WriteItemObject(table.Name, path, true);
} // foreach (DatabaseTableInfo...
} // if (PathIsDrive...
else
{
// Get type, table name and row number from path specified
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
// Get all the rows in the table and then write out the
// row numbers.
foreach (DatabaseRowInfo row in GetRows(tableName))
{
WriteItemObject(row.RowNumber, path, false);
} // foreach (DatabaseRowInfo...
}
else if (type == PathType.Row)
{
// In this case the user has directly specified a row, hence
// just give that particular row
DatabaseRowInfo row = GetRow(tableName, rowNumber);
WriteItemObject(row.RowNumber, path, false);
}
else
{
ThrowTerminatingInvalidPathException(path);
}
} // else
} // GetChildNames
Coisas a lembrar sobre implementar GetChildNames
As seguintes condições podem aplicar-se à sua implementação do System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*
Ao definir a classe de fornecedor, um fornecedor de contentores Windows PowerShell poderá declarar as capacidades do fornecedor de expandWildcards, Filter, Include ou Exclude, da enumeração System.Management.Automation.Provider.Providercapabilities. Nestes casos, a implementação do método System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* deve garantir que o caminho passado para o método satisfaz os requisitos das capacidades especificadas. Para tal, o método deve aceder à propriedade adequada, por exemplo, às propriedades System.Management.Automation.Automation.Provider.Cmdletprovider.Exclude* e System.Management.Automation.Provider.Cmdletprovider.Include* propriedades.
Nota
Uma exceção a esta regra ocorre quando o
returnAllContainers
parâmetro do cmdlet é especificado. Neste caso, o método deve recuperar qualquer nome de criança para um recipiente, mesmo que não corresponda aos valores do Sistema.Management.Automation.Provider.Cmdletprovider.Filter*, System.Management.Automation.Provider.Cmdletprovider.Include*ou System.Management.Automation.Provider.Cmdletprovider.Exclude*.Por predefinição, as substituições deste método não devem recuperar nomes de objetos que são geralmente escondidos do utilizador a menos que a propriedade System.Management.Automation.Provider.Cmdletprovider.Force* seja especificada. Se o caminho especificado indicar um contentor, não é necessário o imóveil System.Management.Automation.Provider.Cmdletprovider.Force*.
A sua implementação de System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* é responsável por prevenir a recursão infinita quando existem ligações circulares, e similares. Deve ser lançada uma exceção adequada para refletir tal condição.
Anexação de parâmetros dinâmicos ao Get-ChildItem Cmdlet (Nome)
Por Get-ChildItem
vezes, o cmdlet (com o Name
parâmetro) requer parâmetros adicionais que são especificados dinamicamente no tempo de execução. Para fornecer estes parâmetros dinâmicos, o fornecedor de recipientes Windows PowerShell deve implementar o método System.Management.Automation.Provider.Containercmdletprovider.Getchildnamesdynamicparameters*. 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.Executtimedefinedparametrtiontion object. O tempo de execução Windows PowerShell utiliza o objeto devolvido para adicionar os parâmetros ao Get-ChildItem
cmdlet.
Este fornecedor não implementa este método. No entanto, o seguinte código é a implementação padrão deste método.
Renomear Itens
Para renomear um item, um fornecedor de contentores Windows PowerShell deve sobrepor-se ao método System.Management.Automation.Provider.Containercmdletprovider.Renameitem*para suportar chamadas a partir do Rename-Item
cmdlet. Este método altera o nome do item no caminho especificado para o novo nome fornecido. O novo nome deve ser sempre relativo ao item-mãe (recipiente).
Este fornecedor não substitui o método System.Management.Automation.Provider.Containercmdletprovider.Renameitem*. No entanto, o seguinte é a implementação padrão.
Coisas a lembrar sobre implementar renomeadorItem
As seguintes condições podem aplicar-se à sua implementação do System.Management.Automation.Provider.Containercmdletprovider.Renameitem*
Ao definir a classe de fornecedor, um fornecedor de contentores Windows PowerShell poderá declarar as capacidades do fornecedor de expandWildcards, Filter, Include ou Exclude, da enumeração System.Management.Automation.Provider.Providercapabilities. Nestes casos, a implementação do método System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* deve garantir que o caminho passado para o método satisfaz os requisitos das capacidades especificadas. Para tal, o método deve aceder à propriedade adequada, por exemplo, às propriedades System.Management.Automation.Automation.Provider.Cmdletprovider.Exclude* e System.Management.Automation.Provider.Cmdletprovider.Include* propriedades.
O método System.Management.Automation.Provider.Containercmdletprovider.Rebatitem*destina-se apenas à modificação do nome de um item e não a operações de movimento. A sua implementação do método deve escrever um erro se o
newName
parâmetro contiver separadores de caminhos, ou poderia fazer com que o item mudasse a sua localização principal.Por predefinição, as substituições deste método não devem mudar o nome de objetos a menos que a propriedade System.Management.Automation.Provider.Cmdletprovider.Force* seja especificada. Se o caminho especificado indicar um contentor, não é necessário o imóveil System.Management.Automation.Provider.Cmdletprovider.Force*.
A sua implementação do método System.Management.Automation.Provider.Containercmdletprovider.Rebatitem*deve ligar para System.Management.Automation.Provider.Cmdletprovider.ShouldProcesso e verificar o seu valor de devolução antes de escoar quaisquer alterações na loja de dados. Este método é utilizado para confirmar a execução de uma operação quando é feita uma alteração ao estado do sistema, por exemplo, renomeando ficheiros. System.Management.Automation.Provider.Cmdletprovider.ShouldProcesso envia o nome do recurso a ser alterado para o utilizador, com o tempo de execução Windows PowerShell tendo em conta quaisquer definições de linha de comando ou variáveis preferenciais na determinação do que deve ser exibido.
Após a chamada para System.Management.Automation.Provider.Cmdletprovider.ShouldProcess returns
true
, o método System.Management.Automation.Automation.Containercmdletprovider.Renameitem*deve chamar o método System.Management.Automation.Automation.Provider.Cmdletprovider.ShouldContinue. Este método envia uma mensagem de confirmação ao utilizador para permitir feedback adicional para dizer se a operação deve ser continuada. Um fornecedor deve ligar para System.Management.Automation.Provider.Cmdletprovider.ShouldContinue como uma verificação adicional de modificações do sistema potencialmente perigosas.
Anexação de parâmetros dinâmicos ao Rename-Item Cmdlet
Por Rename-Item
vezes, o cmdlet requer parâmetros adicionais que são especificados dinamicamente no tempo de execução. Para fornecer estes parâmetros dinâmicos, Windows PowerShell fornecedor de contentores deve implementar o método System.Management.Automation.Provider.Containercmdletprovider.Rebatitemdynamicparameters*. Este método recupera os parâmetros 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.Runtimedefinedparametrtionary object. O tempo de execução Windows PowerShell utiliza o objeto devolvido para adicionar os parâmetros ao Rename-Item
cmdlet.
Este fornecedor de contentores não implementa este método. No entanto, o seguinte código é a implementação padrão deste método.
Criação de novos itens
Para criar novos itens, um fornecedor de contentores deve implementar o método System.Management.Automation.Provider.Containercmdletprovider.Newitem* para suportar chamadas a partir do New-Item
cmdlet. Este método cria um item de dados localizado no caminho especificado. O type
parâmetro do cmdlet contém o tipo definido pelo fornecedor para o novo item. Por exemplo, o fornecedor FileSystem utiliza um type
parâmetro com o valor de "ficheiro" ou "diretório". O newItemValue
parâmetro do cmdlet especifica um valor específico do fornecedor para o novo item.
Eis a implementação do método System.Management.Automation.Provider.Containercmdletprovider.Newitem* para este fornecedor.
protected override void NewItem( string path, string type, object newItemValue )
{
// Create the new item here after
// performing necessary validations
//
// WriteItemObject(newItemValue, path, false);
// Example
//
// if (ShouldProcess(path, "new item"))
// {
// // Create a new item and then call WriteObject
// WriteObject(newItemValue, path, false);
// }
} // NewItem
{
case 1:
{
string name = pathChunks[0];
if (TableNameIsValid(name))
{
tableName = name;
retVal = PathType.Table;
}
}
break;
case 2:
{
string name = pathChunks[0];
Coisas a lembrar sobre implementar o NewItem
As seguintes condições podem aplicar-se à sua implementação do System.Management.Automation.Provider.Containercmdletprovider.Newitem*
O método System.Management.Automation.Provider.Containercmdletprovider.Newitem* deve efetuar uma comparação caso-insensível da cadeia passada no
type
parâmetro. Deve também permitir jogos menos ambíguos. Por exemplo, para os tipos "ficheiro" e "diretório", apenas a primeira letra é necessária para desambiguar. Se otype
parâmetro indicar um tipo que o seu fornecedor não pode criar, o método System.Management.Automation.Provider.Containercmdletprovider.Newitem* deverá escrever uma ArgumentException com uma mensagem indicando os tipos que o fornecedor pode criar.Para o
newItemValue
parâmetro, recomenda-se a implementação do método System.Management.Automation.Provider.Containercmdletprovider.Newitem* para aceitar as cordas no mínimo. Deve também aceitar o tipo de objeto que é recuperado pelo método System.Management.Automation.Provider.Itemcmdletprovider.Getitem* para o mesmo caminho. O método System.Management.Automation.Provider.Containercmdletprovider.Newitem*pode utilizar o método System.Management.Automation.Automation.Languageprimitives.Convertto* para converter tipos para o tipo pretendido.A sua implementação do método System.Management.Automation.Provider.Containercmdletprovider.Newitem*deve ligar para System.Management.Automation.Provider.Cmdletprovider.ShouldProcesso e verificar o seu valor de devolução antes de enteada para qualquer alteração na loja de dados. Após a chamada para System.Management.Automation.Provider.Cmdletprovider.ShouldProcess returns true, o método System.Management.Automation.Provider.Containercmdletprovider.Newitem*deve chamar o método System.Management.Automation.Automation.Provider.Cmdletprovider.DeveContinue o método como uma verificação adicional de modificações do sistema potencialmente perigosas.
Anexação de parâmetros dinâmicos ao New-Item Cmdlet
Por New-Item
vezes, o 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 recipientes deve implementar o método System.Management.Automation.Provider.Containercmdletprovider.Newitemdynamicparameters*. Este método recupera os parâmetros 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.Runtimedefinedparametrtionary object. O tempo de execução Windows PowerShell utiliza o objeto devolvido para adicionar os parâmetros ao New-Item
cmdlet.
Este fornecedor não implementa este método. No entanto, o seguinte código é a implementação padrão deste método.
Remoção de Itens
Para remover os itens, o fornecedor Windows PowerShell deve sobrepor-se ao método System.Management.Automation.Provider.Containercmdletprovider.Removeitem* para suportar chamadas do Remove-Item
cmdlet. Este método elimina um item da loja de dados no caminho especificado. Se o recurse
parâmetro do Remove-Item
cmdlet estiver true
definido, o método remove todos os itens infantis, independentemente do seu nível. Se o parâmetro for false
definido, o método remove apenas um único item no caminho especificado.
Este fornecedor não suporta a remoção do artigo. No entanto, o seguinte código é a implementação predefinitiva do System.Management.Automation.Provider.Containercmdletprovider.Removeitem*.
Coisas a lembrar sobre implementar removeitem
As seguintes condições podem aplicar-se à sua implementação do System.Management.Automation.Provider.Containercmdletprovider.Newitem*
Ao definir a classe de fornecedor, um fornecedor de contentores Windows PowerShell poderá declarar as capacidades do fornecedor de expandWildcards, Filter, Include ou Exclude, da enumeração System.Management.Automation.Provider.Providercapabilities. Nestes casos, a implementação do método System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* deve garantir que o caminho passado para o método satisfaz os requisitos das capacidades especificadas. Para tal, o método deve aceder à propriedade adequada, por exemplo, às propriedades System.Management.Automation.Automation.Provider.Cmdletprovider.Exclude* e System.Management.Automation.Provider.Cmdletprovider.Include* propriedades.
Por predefinição, as substituições deste método não devem remover objetos a menos que a propriedade System.Management.Automation.Provider.Cmdletprovider.Force* seja definida como verdadeira. Se o caminho especificado indicar um contentor, não é necessário o imóveil System.Management.Automation.Provider.Cmdletprovider.Force*.
A sua implementação de System.Management.Automation.Provider.Containercmdletprovider.Removeitem* é responsável por prevenir a recursão infinita quando existem ligações circulares, e similares. Deve ser lançada uma exceção adequada para refletir tal condição.
A sua implementação do método System.Management.Automation.Provider.Containercmdletprovider.Removeitem* deve ligar para System.Management.Automation.Provider.Cmdletprovider.ShouldProcesso e verificar o seu valor de devolução antes de enteada para a loja de dados. Após a chamada para System.Management.Automation.Provider.Cmdletprovider.ShouldProcess returns
true
, o método System.Management.Automation.Automation.Containercmdletprovider.Removeitem*deve chamar o método System.Management.Automation.Automation.Provider.Cmdletprovider.ShouldContinue method como uma verificação adicional para modificações do sistema potencialmente perigosas.
Anexação de parâmetros dinâmicos ao Remove-Item Cmdlet
Por Remove-Item
vezes, o 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 recipientes deve implementar o método System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters* para lidar com estes parâmetros. 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.Executtimedefinedparametrtiontion object. O tempo de execução Windows PowerShell utiliza o objeto devolvido para adicionar os parâmetros ao Remove-Item
cmdlet.
Este fornecedor de contentores não implementa este método. No entanto, o seguinte código é a implementação padrão do System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters*.
Consulta de itens infantis
Para verificar se existem itens para crianças no caminho especificado, o fornecedor de recipientes Windows PowerShell deve sobrepor-se ao método System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*. Este método devolve true
se o item tiver filhos, e de outra false
forma. Para um caminho nulo ou vazio, o método considera que quaisquer itens na loja de dados são crianças e devoluções true
.
Aqui está a sobreposição para o método System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*. Se existirem mais de duas peças de caminho criadas pelo método do ajudante ChunkPath, o método retorna, false
uma vez que apenas um recipiente de base de dados e um recipiente de mesa são definidos. Para obter mais informações sobre este método de ajuda, consulte o método ChunkPath na Criação de um fornecedor de Windows PowerShell item.
protected override bool HasChildItems( string path )
{
return false;
} // HasChildItems
ErrorCategory.InvalidOperation, tableName));
}
return results;
Coisas a lembrar sobre implementar haschilditems
As seguintes condições podem aplicar-se à sua implementação do System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*
- Se o fornecedor de recipientes expor uma raiz que contenha pontos de montagem interessantes, a implementação do método System.Management.Automation.Provider.Containercmdletprovider.Haschilditems* deve regressar
true
quando um fio nulo ou vazio for passado para o caminho.
Itens de cópia
Para copiar itens, o fornecedor de recipientes deve implementar o método System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem para suportar chamadas do Copy-Item
cmdlet. Este método copia um item de dados da localização indicada pelo path
parâmetro do cmdlet para a localização indicada pelo copyPath
parâmetro. Se o recurse
parâmetro for especificado, o método copia todos os subcongrupos. Se o parâmetro não for especificado, o método copia apenas um único nível de itens.
Este fornecedor não implementa este método. No entanto, o seguinte código é a implementação padrão do System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem.
Coisas a lembrar sobre implementar copyItem
As seguintes condições podem aplicar-se à sua implementação do System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem:
Ao definir a classe de fornecedor, um fornecedor de contentores Windows PowerShell poderá declarar as capacidades do fornecedor de expandWildcards, Filter, Include ou Exclude, da enumeração System.Management.Automation.Provider.Providercapabilities. Nestes casos, a implementação do método System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* deve garantir que o caminho passado para o método satisfaz os requisitos das capacidades especificadas. Para tal, o método deve aceder à propriedade adequada, por exemplo, às propriedades System.Management.Automation.Automation.Provider.Cmdletprovider.Exclude* e System.Management.Automation.Provider.Cmdletprovider.Include* propriedades.
Por predefinição, as substituições deste método não devem copiar objetos sobre objetos existentes, a menos que a propriedade System.Management.Automation.Provider.Cmdletprovider.Force* esteja definida para
true
. Por exemplo, o fornecedor do FileSystem não copiará c:\temp\abc.txt sobre um ficheiro c:\abc.txt existente, a menos que a propriedade System.Management.Automation.Provider.Cmdletprovider.Force* esteja definida paratrue
. Se o caminho especificado nocopyPath
parâmetro existir e indicar um recipiente, não é necessário o imóveil System.Management.Automation.Provider.Cmdletprovider.Force*. Neste caso, System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem deve copiar o item indicado pelopath
parâmetro para o recipiente indicado pelo parâmetro emcopyPath
criança.A sua implementação de System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem é responsável por prevenir a recursão infinita quando existem ligações circulares, e similares. Deve ser lançada uma exceção adequada para refletir tal condição.
A sua implementação do método System.Management.Automation.Automation.Provider.ContainerCmdletProvider.CopyItem deve ligar para System.Management.Automation.Provider.Cmdletprovider.ShouldProcesso e verificar o seu valor de devolução antes de escoar quaisquer alterações na loja de dados. Após a chamada para System.Management.Automation.Provider.Cmdletprovider.ShouldProcess returns true, o método System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem deve ligar para o método System.Management.Automation.Automation.Provider.Cmdletprovider.DeveContinue como uma verificação adicional de modificações do sistema potencialmente perigosas. Para obter mais informações sobre a chamada destes métodos, consulte Itens renomeados.
Anexação de parâmetros dinâmicos ao Copy-Item Cmdlet
Por Copy-Item
vezes, o 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 recipientes Windows PowerShell deve implementar o método System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters* para lidar com estes parâmetros. Este método recupera os parâmetros 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.Runtimedefinedparametrtionary object. O tempo de execução Windows PowerShell utiliza o objeto devolvido para adicionar os parâmetros ao Copy-Item
cmdlet.
Este fornecedor não implementa este método. No entanto, o seguinte código é a implementação padrão do System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters*.
Amostra de código
Para obter o código de amostra completo, consulte AccessDbProviderSample04 Code Sample.
Construção do Provedor de Windows PowerShell
Ver Como Registar Cmdlets, Fornecedores e Aplicações de Anfitrião.
Testar o Provedor de Windows PowerShell
Quando o seu fornecedor Windows PowerShell estiver registado com Windows PowerShell, pode testá-lo executando os cmdlets suportados na linha de comando. Esteja ciente de que a saída de exemplo a seguir utiliza uma base de dados de acesso fictícia.
Executar o
Get-ChildItem
cmdlet para recuperar a lista de itens infantis de uma tabela clientes na base de dados Access.Get-ChildItem mydb:customers
Aparece a seguinte saída.
PSPath : AccessDB::customers PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : True Data : System.Data.DataRow Name : Customers RowCount : 91 Columns :
Volte a executar o
Get-ChildItem
cmdlet para recuperar os dados de uma tabela.(Get-ChildItem mydb:customers).data
Aparece a seguinte saída.
TABLE_CAT : c:\PS\northwind TABLE_SCHEM : TABLE_NAME : Customers TABLE_TYPE : TABLE REMARKS :
Utilize agora o
Get-Item
cmdlet para recuperar os itens na linha 0 da tabela de dados.Get-Item mydb:\customers\0
Aparece a seguinte saída.
PSPath : AccessDB::customers\0 PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : False Data : System.Data.DataRow RowNumber : 0
Reutilizar
Get-Item
para recuperar os dados dos itens na linha 0.(Get-Item mydb:\customers\0).data
Aparece a seguinte saída.
CustomerID : 1234 CompanyName : Fabrikam ContactName : Eric Gruber ContactTitle : President Address : 4567 Main Street City : Buffalo Region : NY PostalCode : 98052 Country : USA Phone : (425) 555-0100 Fax : (425) 555-0101
Agora use o
New-Item
cmdlet para adicionar uma linha a uma mesa existente. OPath
parâmetro especifica o caminho completo para a linha, e deve indicar um número de linha superior ao número de linhas existente na tabela. OType
parâmetro indica "linha" para especificar este tipo de item a adicionar. Finalmente, oValue
parâmetro especifica uma lista delimitada por vírgula dos valores da coluna para a linha.New-Item -Path mydb:\Customers\3 -ItemType "row" -Value "3,CustomerFirstName,CustomerLastName,CustomerEmailAddress,CustomerTitle,CustomerCompany,CustomerPhone, CustomerAddress,CustomerCity,CustomerState,CustomerZip,CustomerCountry"
Verifique a correção da operação do novo artigo da seguinte forma.
PS mydb:\> cd Customers PS mydb:\Customers> (Get-Item 3).data
Aparece a seguinte saída.
ID : 3 FirstName : Eric LastName : Gruber Email : ericgruber@fabrikam.com Title : President Company : Fabrikam WorkPhone : (425) 555-0100 Address : 4567 Main Street City : Buffalo State : NY Zip : 98052 Country : USA
Consulte também
Criação de fornecedores de Windows PowerShell
Designing Your Windows PowerShell Provider (Criar o seu Fornecedor do Windows PowerShell)
Implementação de um fornecedor de Windows PowerShell de artigos
Implementação de um Fornecedor de Windows PowerShell de Navegação
Como registar cmdlets, fornecedores e aplicações de anfitrião
Windows PowerShell SDK (SDK do Windows PowerShell)
Windows PowerShell Programmer's Guide (Guia do Programador do Windows PowerShell)